2013-07-16 61 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将是我的第一选择:) –