Выбор самых последних записей в течение месяца?
Используя следующий запрос и результаты, я ищу самую последнюю запись в течение месяца, где EmpId уникален. Запрос ниже не дает мне желаемого результата.
SELECT M.Name, M.Score, MAX(M.TestDate) FROM myTable M
GROUP BY M.Name, M.Score, M.TestDate
ORDER BY M.TestDate
myTable
EmpId TestId Score Name TestDate
1 1 MATH 90 4/1/2008
1 1 MATH 100 4/6/2008
1 1 MATH 70 4/15/2008
2 1 MATH 70 5/1/2008
2 1 MATH 80 5/6/2008
2 1 MATH 100 5/15/2008
Желаемая:
EmpId TestId Score Name TestDate
1 1 MATH 70 4/15/2008
2 1 MATH 100 5/15/2008
1 ответ
Решение
Вы можете сделать это, используя функцию ROW_NUMBER() внутри подзапроса:
SELECT * FROM
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY EmpId ORDER BY TestDate DESC) RN
FROM MyTable
) x
WHERE x.RN = 1
или.. если по какой-то причине вы действительно хотите использовать GROUP BY
можно сделать так:
WITH CTE_Group AS
(
SELECT EmpId, MAX(TestDate) AS MaxDate
FROM MyTable
GROUP BY EmpId
)
SELECT m.*
FROM CTE_Group g
LEFT JOIN dbo.MyTable m ON g.EmpId = m.EmpId AND g.MaxDate = m.TestDate
Разница в том, что - если есть две строки с одинаковой датой для одного и того же empID - GROUP BY
вернет их обоих, в то время как ROW_NUMBER()
все равно вернется только один. Замена ROW_NUMBER()
с RANK()
Функция также будет возвращать обе строки.