Можно ли использовать 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
Спасибо за любую помощь.
Томас
Ответы
Ответ 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