Запрос: отобрать максимальные в группе

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Запрос: отобрать максимальные в группе

Сообщение Leon_ » 17.08.2004 (Вт) 16:39

Видимо, уже туплю под вечер -- ничего не могу придумать. Есть
ID Inv Date
1...30...19.02.2004
2...30...01.04.2004
3...30...23.03.2004
4...7.....14.01.2004
5...7.....07.04.2004
6...7.....14.07.2004
Надо получить:
2...30...01.04.2004
6...7.....14.07.2004

т.е. отобрать такие записи, у которых Max(Date), группируя по Inv
?? :roll: :(
PS: Access

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 17.08.2004 (Вт) 17:07

Select {поля} From TABLE Group By Inv Having Date=(Select Max(Date) From TABLE)

Кривовато, но вроде правильно. Или я не так понял задачу ;)

Или же...

Select {поля} From TABLE Where Date=(Select Max(Date) From TABLE) Group By Inv

В первом случае можно собрать все данные, если данная INV встречается с датой Max(Date). Во втором случае выбираются ТОЛЬКО данные, где дата Max(Date)
Последний раз редактировалось ZlydenGL 17.08.2004 (Вт) 17:20, всего редактировалось 1 раз.
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 17.08.2004 (Вт) 17:19

Да, под вечер оно похуже соображается.
Попробуй так:

Код: Выделить всё
SELECT * FROM MyTable M, (SELECT Inv, MAX([Date]) FROM MyTable GROUP BY [Inv]) AS T WHERE M.Inv=T.Inv AND M.[Date]=T.[Date]
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 17.08.2004 (Вт) 17:22

Так, мы какую задачу вообще решаем? :)

Андрей, твой запрос выберет в общем-то ВСЕ данные, для которых присутствует вообще хоть какая-то дата. А надо я так понял чтобы выбрались записи только с датой, максимальной для всей таблицы. Leon_, я прав? Или как всегда? ;)
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 18.08.2004 (Ср) 7:19

Мой запрос выберет записи товаров с максимальной датой, то есть последние для каждого типа товара. Как я понимаю это и было нужно...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 18.08.2004 (Ср) 8:24

ZlydenGL писал(а):я так понял чтобы выбрались записи только с датой, максимальной для всей таблицы
2ZlydenGL:
Нет. Записи с максимальной датой по каждому "товару", группируя по товарам.

2Andrey Fedorov: Этот запрос работает, как я и спрашивал, все ОК
Код: Выделить всё
SELECT * FROM MyTable M, (SELECT Inv, MAX([Date]) FROM MyTable GROUP BY [Inv]) AS T WHERE M.Inv=T.Inv AND M.[Date]=T.[Date]

Спасибо :)

PS: Только.. как бы это сформулировать, чтобы не показаться формалистом.. :?
Ну в общем, полученный запрос составной, в котором мы увязываем нужные поля из MyTable с предварительно найденными макс датами по "товарам". Но увязываем по паре [Date]+[Inv], т.е. они нам образуют "составной ключ". Но в MyTable уже есть ключевое поле, [ID]. Primary key в общем. Мне представляется, что "самый правильный запрос" 8) должен выдавать правильный результат, связывая "плечи" составных частей по PK? Не зря же я поселил в эту таблицу PK?
Все работает как надо, это просто теоретические рассуждения.. :?:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.08.2004 (Ср) 9:07

А как ты из PK узнаешь дату записи?
Ты группируешь по Inv, поэтому все остальные поля могут быть выражены только через агрегатные функции (например, MAX). Можно было конечно указать SELECT Inv, MAX([Date]), MAX(ID), только что бы это дало?

Вообщем в конечном рекордсете у тебя будет ID, его и используй. А связывать поля внутри запроса иначе никак не выйдет.
Lasciate ogni speranza, voi ch'entrate.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 18.08.2004 (Ср) 9:26

Да я и не утверждаю обратного. Просто.. мечтаю о красивостях :-)
Ну нет, так нет. Главное -- работает, и ладно!


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 2

    TopList