选择一个月内的最新记录?

时间:2013-07-16 16:13:39

标签: sql sql-server group-by

使用以下查询和结果,我正在寻找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 个答案:

答案 0 :(得分:2)

您可以使用子查询中的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()也会返回两行。