使用以下查询和结果,我正在寻找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
答案 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()
也会返回两行。