Так что я знаю, что эта проблема не нова, но я пытаюсь обернуть ее вокруг и понять, как лучше всего справиться с подобными сценариями.
Скажем, у меня есть гипотетическая таблица 'X', которая выглядит следующим образом:
GroupID ID (identity) SomeDateTime
--------------------------------------------
1 1000 1/1/01
1 1001 2/2/02
1 1002 3/3/03
2 1003 4/4/04
2 1004 5/5/05
Я хочу сделать запрос, чтобы результирующий набор выглядел так:
----------------------------------------
1 1002 3/3/03
2 1004 5/5/05
В основном я хочу получить значение MAX SomeDateTime
, сгруппированное по моему столбцу GroupID
. Кикер в том, что я не хочу группировать по столбцу ID
,
Я просто хочу знать «ID», который соответствует MAX SomeDateTime
.
Я знаю, что одно псевдо-решение будет:
;WITH X1 as (
SELECT MAX(SomeDateTime) as SomeDateTime, GroupID
FROM X
GROUP BY GroupID
)
SELECT X1.SomeDateTime, X1.GroupID, X2.ID
FROM X1
INNER JOIN X as X2
ON X.DateTime = X2.DateTime
Но это не решает тот факт, что DateTime может быть не уникальным. И кажется, что присоединение к DateTime кажется таким неряшливым.
Другое псевдо-решение может быть:
SELECT X.GroupID, MAX(X.ID) as ID, MAX(X.SomeDateTime) as SomeDateTime
FROM X
GROUP BY X.GroupID
Но нет никаких гарантий, что ID
действительно будет соответствовать строке, из которой SomeDateTime
происходит.
Третий менее полезный параметр может быть:
SELECT TOP 1 X.GroupID, X.ID, X.SomeDateTime
FROM X
WHERE X.GroupID = 1
ORDER BY X.SomeDateTime DESC
Но очевидно, что это работает только с одним известным GroupID
. Я хочу иметь возможность присоединиться к этому набору результатов GroupID
и / или ID
.
Кто-нибудь знает какие-нибудь умные решения? Любое хорошее использование оконных функций?
Спасибо!