Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как выбрать записи с максимальными значениями одной колонки?  [new]
Term2
Member

Откуда:
Сообщений: 46
Требуется выбрать из таблицы некоторые записи, но только те, у которых значение некоторой колонки максимальное. То есть мне надо такое условие добавить. Подскажите как это можно сделать?
22 дек 08, 15:15    [6603819]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36691
where колонка = (select max(колонка) from та же таблица)
22 дек 08, 15:16    [6603826]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
SELECT TOP 1 WITH TIES *
FROM [Таблица]
ORDER BY [Колонка] DESC;
22 дек 08, 15:29    [6603924]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
Term2
Member

Откуда:
Сообщений: 46
что-то запрос уходит надолго в себя и зависает
22 дек 08, 15:31    [6603940]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36691
Term2
что-то запрос уходит надолго в себя и зависает
Какой?
22 дек 08, 15:33    [6603954]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
Term2
Member

Откуда:
Сообщений: 46
Гавриленко Сергей Алексеевич
Term2
что-то запрос уходит надолго в себя и зависает
Какой?


where колонка = (select max(колонка) from та же таблица)
22 дек 08, 15:35    [6603969]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36691
Term2
Гавриленко Сергей Алексеевич
Term2
что-то запрос уходит надолго в себя и зависает
Какой?


where колонка = (select max(колонка) from та же таблица)
Прям вот такой вот запрос работать вовсе не будет.
22 дек 08, 15:40    [6603991]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
Wizet
Guest
совсем расширенный вариант:

select id,value,max(s_value) from table1 group by id

Выбирает для каждого ID значение value у которого значение s_value максимально, например выбрать максимальные суммы заказов и имена для каждого работника за год будет так:
select id,name,max(zakaz_price) where year=2009 from table1 group by id

на выходе будет id - имя сотрудника - максимальная стоимость заказа за 2009 год

П.С. Пример придуманный - понятно что хранить имена сотрудников в таблице заказов глупо =)
П.П.С. Тему нашел случайно через Яндекс, по всем вопросам пишите support@personalmail.ru
11 июн 10, 11:43    [8929609]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36691
Wizet
совсем расширенный вариант:

select id,value,max(s_value) from table1 group by id

Выбирает для каждого ID значение value у которого значение s_value максимально, например выбрать максимальные суммы заказов и имена для каждого работника за год будет так:
select id,name,max(zakaz_price) where year=2009 from table1 group by id

на выходе будет id - имя сотрудника - максимальная стоимость заказа за 2009 год

П.С. Пример придуманный - понятно что хранить имена сотрудников в таблице заказов глупо =)
П.П.С. Тему нашел случайно через Яндекс, по всем вопросам пишите support@personalmail.ru
Старее темы не было? А то и двух лет не прошло.

З.Ы. Я уже молчу про то, что ни один из приведенных запросов работать не будет.

Сообщение было отредактировано: 11 июн 10, 11:47
11 июн 10, 11:47    [8929646]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
Wizet
Guest
Поисковику пофиг на возраст, а ответа в тему никто так и не дал.
в примере выше - id это не primary key а идентификатор сотрудника, и заранее извиняюсь - не глянул название ветки, писал по mysql - там все запросы работают 100%, только что проверил вот такой запрос
select obor_id,cena,max(date_in) from price_change group by obor_id - вывел последние цены по каждому оборудованию по date_in (int, unix timestamp), возможно mssql не поддерживает агрегатные функции в имени поля, нужно проверять....
11 июн 10, 12:41    [8930282]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36691
Wizet
Поисковику пофиг на возраст, а ответа в тему никто так и не дал.
в примере выше - id это не primary key а идентификатор сотрудника, и заранее извиняюсь - не глянул название ветки, писал по mysql - там все запросы работают 100%, только что проверил вот такой запрос
select obor_id,cena,max(date_in) from price_change group by obor_id - вывел последние цены по каждому оборудованию по date_in (int, unix timestamp), возможно mssql не поддерживает агрегатные функции в имени поля, нужно проверять....
Для полноты ответа еще надо написать запросы, работающие на оракле, постгри и дб/2.
11 июн 10, 12:44    [8930338]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
Интересно, и какая же cena возвращается для одного конкретного obor_id?
Минимальная, максимальная, средняя - какая?
11 июн 10, 12:51    [8930430]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
iljy
Member

Откуда:
Сообщений: 8711
iap
Интересно, и какая же cena возвращается для одного конкретного obor_id?
Минимальная, максимальная, средняя - какая?

Если obor_id первичный ключ - она единственная. мускуль тут отходит от стандарта, в мсскуле надо писать group by obor_id,cena, хотя группировку по цене оптимизатор тут все рано уберет.
11 июн 10, 12:57    [8930504]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
Wizet
Guest
iap, а вы правы на 100%, не сортирует.. а тема оказывается глубже чем я думал...
11 июн 10, 13:19    [8930732]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
iljy
iap
Интересно, и какая же cena возвращается для одного конкретного obor_id?
Минимальная, максимальная, средняя - какая?

Если obor_id первичный ключ - она единственная. мускуль тут отходит от стандарта, в мсскуле надо писать group by obor_id,cena, хотя группировку по цене оптимизатор тут все рано уберет.
Если obor_id первичный ключ, то глупо его писать в GROUP BY.
Ну если только по каким-то веским и очень хитрым причинам.
11 июн 10, 13:29    [8930818]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
Wizet
iap, а вы правы на 100%, не сортирует.. а тема оказывается глубже чем я думал...
А где я в этой теме про сортировку говорил?
Чего-то не вижу...
11 июн 10, 13:31    [8930827]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
Wizet
Guest
iap, вы спрашивали какую цену выводит... в том запросе выводит без сортировки - первую попавшуюся..

и народ не тупите - группировать по первичному ключу это идиотизм, первичный ключ в запросе вообще не фигурирует. obor_id это номер оборудования для которого в дату date_in была установлена цена cena
правильный запрос сейчас выглядит так

select obor_id,cena from price_change where date_in IN (select max(date_in) from price_change group by obor_id)

подзапрос выбирает максимальные (последние) даты для каждого оборудования, а сам запрос находит по этим датам соответвующие строки и выводит в виде таблицы id_оборудования,цена

п.с. запрос работает при условии уникальности date_in, в противном случае пришлось бы доставать значения primary_key
11 июн 10, 13:58    [8931073]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
Wizet
Guest
жаль, но по факту укоротить запрос не удалось, в первых постах уже был дан ответ, правда в урезанной форме
11 июн 10, 14:03    [8931133]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
Wizet
iap, вы спрашивали какую цену выводит... в том запросе выводит без сортировки - первую попавшуюся..
Ааа! А я уж было подумал, вычисляет по каким-то определённым правилам.
11 июн 10, 14:10    [8931193]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
Wizet
Guest
а для гуру SQL задачка
можно ли при использовании неуникальных значений date_in обойтись без двух подзапросов, т.к. получаются уже 3 запроса:
выборка date_in,
выборка primary_key по первой выборке,
выборка нужных колонок по второй выборке
11 июн 10, 14:14    [8931229]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
Wizet
Guest
нет... тут вообще фигня... он первичный ключи по неуникальным значениям не вытащит......
11 июн 10, 14:16    [8931249]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
Wizet
жаль, но по факту укоротить запрос не удалось, в первых постах уже был дан ответ, правда в урезанной форме
Wizet
select obor_id,cena from price_change where date_in IN (select max(date_in) from price_change group by obor_id)
Версия MSSQL >= 9.0
  • 1
    SELECT TOP(1)WITH TIES *
    FROM price_change
    ORDER BY RANK()OVER(PARTITION BY obor_id ORDER BY date_in DESC);
  • 2
    WITH CTE AS(RANK()OVER(PARTITION BY obor_id ORDER BY date_in DESC)N,* FROM price_change)
    SELECT *
    FROM CTE
    WHERE N=1;
  • 3
    SELECT pc.*
    FROM price_change pc
    CROSS APPLY (SELECT TOP(1) WITH TIES * FROM price_change t WHERE t.obor_id=pc.obor_id ORDER BY date_in DESC) T;
  • Это имеете в виду?
    11 июн 10, 14:20    [8931285]     Ответить | Цитировать Сообщить модератору
     Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 46952
    Нет, №3 - неточен (сам никогда так не делаю). Наверно, так:
    версия MSSQL >= 9.0
  • 3
    SELECT pc.*
    FROM price_change pc
    CROSS APPLY (SELECT TOP(1) WITH TIES * FROM price_change t WHERE t.obor_id=pc.obor_id ORDER BY date_in DESC) T
    WHERE pc.id=T.id;
  • где id - это PK
    11 июн 10, 14:25    [8931336]     Ответить | Цитировать Сообщить модератору
     Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
    Wizet
    Guest
    iap, спасибо за перевод между языками ;)

    а по поводу задачки выше - решить её через временную таблицу можно... но в любом случае не гарантирована уникальность связки obor_id и date_in - так как это не первичные ключи

    сейчас проверка реализована посредством php перед выводом в браузер, вот думал перенести нагрузку с php на БД, но видно не судьба - а то вылавливай потом ошибки.....
    11 июн 10, 14:29    [8931384]     Ответить | Цитировать Сообщить модератору
     Re: Как выбрать записи с максимальными значениями одной колонки?  [new]
    iljy
    Member

    Откуда:
    Сообщений: 8711
    iap
    Если obor_id первичный ключ, то глупо его писать в GROUP BY.
    Ну если только по каким-то веским и очень хитрым причинам.

    Например если идет join с другой таблицей.
    11 июн 10, 16:50    [8932676]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
    Все форумы / Microsoft SQL Server Ответить