Подтвердить что ты не робот

Можно ли использовать ROW_NUMBER() OVER/PARTITION BY только в том случае, если другой столбец тоже одинаков?

Я использую этот код: (из этого вопроса: Как получить последнюю запись для каждой группы в SQL, заменяя мои собственные столбцы)

WITH e AS
(
 SELECT *,
     ROW_NUMBER() OVER
     (
         PARTITION BY ApplicationId
         ORDER BY theDate DESC
     ) AS Recency
 FROM [Event]
)
SELECT *
FROM e
WHERE Recency = 1

Можно ли "разделять" только в том случае, если два поля одинаковы? Например, у меня есть такие данные:

ID      Name    theDate
123     John    01/01/2012
123     John    01/02/2012
123     Doe     01/01/2012
456     Smith   02/04/2012
789     Smith   02/01/2012
789     Smith   02/09/2012
789     Roger   02/08/2012

Из этих данных я бы хотел вернуться:

ID      Name    theDate
123     John    01/02/2012
123     Doe     01/01/2012
456     Smith   02/04/2012
789     Smith   02/09/2012
789     Roger   02/08/2012

Спасибо за любую помощь.

Томас

4b9b3361

Ответ 1

Я нашел здесь ответ: Разделение таблиц с использованием 2 столбцов

Вы можете разделить только на 1 столбец, однако этот столбец можно создать, чтобы сделать "несколько разделов" следующим образом:

WITH e AS 
( 
 SELECT *, 
 ROW_NUMBER() OVER 
 ( 
     PARTITION BY CONVERT(VARCHAR(100),ApplicationId) + ' ' + Name
     ORDER BY theDate DESC 
 ) AS Recency 
 FROM [Event] 
) 
SELECT * 
FROM e 
WHERE Recency = 1 

Добавление двух столбцов вместе как одна строка гарантирует, что она будет разделяться только в том случае, если оба столбца идентичны.

Ответ 2

У вас может быть несколько столбцов, разделенных запятой

WITH e AS 
( 
 SELECT *, 
     ROW_NUMBER() OVER 
     ( 
         PARTITION BY ApplicationId , Name
         ORDER BY theDate DESC 
     ) AS Recency 
 FROM [Event] 
) 
SELECT * 
FROM e 
WHERE Recency = 1