Выбор самых последних записей в течение месяца?

Используя следующий запрос и результаты, я ищу самую последнюю запись в течение месяца, где 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

SQLFiddle DEMO

или.. если по какой-то причине вы действительно хотите использовать 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

SQLFiddle DEMO

Разница в том, что - если есть две строки с одинаковой датой для одного и того же empID - GROUP BY вернет их обоих, в то время как ROW_NUMBER() все равно вернется только один. Замена ROW_NUMBER() с RANK() Функция также будет возвращать обе строки.

Другие вопросы по тегам