2013-07-16 59 views
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 

回答

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()仍然將返回唯一的一個。 用RANK()替換ROW_NUMBER()函數也會返回兩行。

+0

我認爲CTE的例子就是要走的路。 –

+0

我通常使用'CTE'方法,但我認爲'ROW_NUMBER()'版本更簡潔並且寫得更簡單。 – JoeFletch

+1

@MikeHenderson和@JoeFletch「GROUP BY」和「ROW_NUMBER()」示例都可以與CTE或SubQuery交換。 'ROW_NUMBER()'與CTE將是我的第一選擇:) –