0

使用以下查询和结果,我正在查找 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
4

1 回答 1

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 演示

或者..如果出于某种原因,你真的想使用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 演示

不同之处在于 - 如果同一 empID 有两行具有相同日期的行 -GROUP BY将同时返回它们,而ROW_NUMBER()仍然只返回一个。ROW_NUMBER()用函数替换 RANK()也会返回两行。

于 2013-07-16T16:19:27.233 回答