2010-07-15 2 views
1

я следующие данные:SQL Query Group By Справка

cust subject date 
Cust1 Subject1 2010-12-31 21:59:59.000 
Cust1 Subject1 2010-12-31 21:59:59.000 
Cust4 Subject3 2011-02-27 21:59:59.000 
Cust5 Subject1 2010-10-31 21:59:59.000 
Cust5 Subject2 2010-10-31 21:59:59.000 
Cust6 Subject2 2010-10-31 21:59:59.000 
Cust6 Subject2 2010-12-31 21:59:59.000 

Мне нужно добиться следующего:

  • группы их Каст и при
  • Если есть 2 записи с то же самое cust и subject, то мне нужно вернуть тот, который имеет самую высокую дату
  • Следуя приведенным выше, если даты совпадают, тогда возвратите только 1 из них.

Результат запроса должен быть:

cust subject date 
Cust1 Subject1 2010-12-31 21:59:59.000 
Cust4 Subject3 2011-02-27 21:59:59.000 
Cust5 Subject1 2010-10-31 21:59:59.000 
Cust5 Subject2 2010-10-31 21:59:59.000 
Cust6 Subject2 2010-12-31 21:59:59.000 

Может кто-нибудь помочь мне с этим?

мне удалось сделать 2 из требований, но не все 3.

ответ

0

Использование ROW_NUMBER() - если вы не использовали этот и другие функции секционирования ранее, то я могу определенно рекомендую посмотреть на них, как они (особенно ROW_NUMBER()), имеют много применений.

SELECT cust, subject, date 
FROM (
    SELECT cust, subject, date, ROW_NUMBER() OVER (PARTITION BY cust, subject ORDER BY date DESC) AS RN 
    FROM <your table> 
) SubQuery 
WHERE SubQuery.RN = 1 
+0

Конечно, MAX ([дата]) работает ... ROW_NUMBER() является излишним. :) Тем не менее, мне это нравится! –

+0

Я думаю, вам нужно добавить 'AS RN' в столбце номера строки для предложения' WHERE', чтобы правильно функционировать ... –

+0

Большое спасибо. Причина, по которой я принял это в качестве ответа, заключался в том, что я забыл упомянуть, что у меня есть другие столбцы, которые мне нужно возвращать, а также, что я не буду включать их в группу и не могу использовать их агрегатную функцию (например, заголовок например), и он не будет работать с обычной группой путем подхода (по крайней мере, не так легко, как этот). Я посмотрю на функции секционирования, они кажутся большой заставкой. – HaniBey

5
SELECT cust, subject, max([date]) FROM myTable GROUP BY cust, subject; 

Вы на самом деле не имеют столбец с именем date, не так ли? date - это зарезервированное слово, поэтому в моем запросе оно должно быть окружено квадратными скобками.

+2

Sweet'n'simple - +1! =) –

+1

+1 для использования зарезервированного слова. –

0
select cust, subject, max(date) from table group by cust, subject