Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запрос макс. значения  [new]
Konstantin
Member

Откуда: Moscow
Сообщений: 50
Есть таблица T1(id I, P1 I, P2 I, cd DateTime)

Нужно получить Id, у кот. максимальное cd для совокупности P1 и P2.
Т.е. нужно сделать типа такого:

SELECT id, P1, P2, MAX(cd) AS EXPR1
FROM T1
GROUP BY P1, P2

Но ругается, сами знаете почему... Потому что id нет в GROUP BY.
Можно ли все-таки такое сделать одним запросом?
13 сен 05, 16:43    [1873709]     Ответить | Цитировать Сообщить модератору
 Re: Запрос макс. значения  [new]
woltron
Member

Откуда: Санкт-Петербург
Сообщений: 93
Konstantin
Есть таблица T1(id I, P1 I, P2 I, cd DateTime)

Нужно получить Id, у кот. максимальное cd для совокупности P1 и P2.
Т.е. нужно сделать типа такого:

SELECT id, P1, P2, MAX(cd) AS EXPR1
FROM T1
GROUP BY P1, P2

Но ругается, сами знаете почему... Потому что id нет в GROUP BY.
Можно ли все-таки такое сделать одним запросом?


;)

SELECT id=max(id), P1, P2, max_cd=MAX(cd) 
FROM T1
GROUP BY P1, P2

13 сен 05, 16:46    [1873737]     Ответить | Цитировать Сообщить модератору
 Re: Запрос макс. значения  [new]
YellowMan
Member

Откуда: острова
Сообщений: 1047
А совокупность Р1, Р2 и max(cd) уникальная ?
Если да то почему бы не сделать с подзапросом или джойном ?

Если нет то какое из id требуется ?
13 сен 05, 16:47    [1873741]     Ответить | Цитировать Сообщить модератору
 Re: Запрос макс. значения  [new]
woltron
Member

Откуда: Санкт-Петербург
Сообщений: 93
На самом деле нужно вложенным запросом
SELECT id
FROM T1
 join
(SELECT P1, P2, max_cd=MAX(cd) FROM T1 GROUP BY P1, P2) f on 
  f.p1 = t1.p1 
  and f.p2=t1.p2
  and f.max_cd=t1.cd
13 сен 05, 16:52    [1873777]     Ответить | Цитировать Сообщить модератору
 Re: Запрос макс. значения  [new]
YellowMan
Member

Откуда: острова
Сообщений: 1047
woltron
На самом деле нужно вложенным запросом


Боюсь показаться занудой но твой запрос вернет больше одного ID - если конечно есть дубли по max(cd), P1 и P2
13 сен 05, 16:58    [1873810]     Ответить | Цитировать Сообщить модератору
 Re: Запрос макс. значения  [new]
woltron
Member

Откуда: Санкт-Петербург
Сообщений: 93
Вернет больше одного? - Да, но только если есть повторяющиеся значения. Тут нужно определиться с тем, что нужно получить в таком случае ;)
13 сен 05, 17:03    [1873848]     Ответить | Цитировать Сообщить модератору
 Re: Запрос макс. значения  [new]
Konstantin
Member

Откуда: Moscow
Сообщений: 50
Действительно предложенное
SELECT id=max(id), P1, P2, max_cd=MAX(cd)
FROM T1
GROUP BY P1, P2
никак не катит.

А вот join катит, но это как я понимаю равносильно двум последовательным запросам. Этот вариант у меня и был.
Сначала:
SELECT P1, P2, max_cd=MAX(cd)
FROM T1
GROUP BY P1, P2
INTO CURSOR F1
А потом:
SELECT id
FROM T1
WEHRE t1.p1=f1.p1 AND
t1.p2=f1.p2
AND t1.cd=f1.max_cd

Даже если есть дубли и запрос вернет больше одного id это в моем случае не критично и я возьму первый попавшийся.

Других вариантов нет?
13 сен 05, 17:09    [1873890]     Ответить | Цитировать Сообщить модератору
 Re: Запрос макс. значения  [new]
YellowMan
Member

Откуда: острова
Сообщений: 1047
Джойн не равносилен двум последовательным запросам - план будет совсем другой. Иногда лучше чем 2 запроса а бывает что и гораздо хуже - надо смотреть.

Других путей ИМХО нет - вам надо выбрать ID по комбинированному ключу P1,P2 и max(cd). А для этого этот ключ надо как-то получить.
13 сен 05, 17:13    [1873915]     Ответить | Цитировать Сообщить модератору
 Re: Запрос макс. значения  [new]
Konstantin
Member

Откуда: Moscow
Сообщений: 50
Понял...Большое спасибо...
Буду щас смотреть по производительности...
13 сен 05, 17:19    [1873960]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить