根据分组选择顶行

时间:2014-06-04 22:13:45

标签: sql sql-server-2008-r2

我认为这是一种常见的情况,但我无法得到逻辑。 我有一张表如下。

PersonID SchoolID EndDate
-------- -------- -------
1        ABC      2013
1        DEF      2014
1        GHI      2010
2        XYZ      2013    
2        UVW      2011

我想要以下输出

PersonID SchoolID EndDate
-------- -------- -------
1        DEF      2014
2        XYZ      2013    

基本上,我想为每个人提供最新的学校。因此,我尝试做类似

的事情
SELECT SchoolID, PersonID,EndDate FROM tbl
GROUP BY PersonID
HAVING EndDate = MAX(ENDDATE)
ORDER BY EndDate DESC 

但我收到一条错误,说在一个HAVING子句中EndDate无效,因为它不包含在聚合函数或group by子句中。
我试过这个

SELECT SchoolID, PersonID,MAX(EndDate) FROM tbl
GROUP BY PersonID
ORDER BY EndDate DESC 

由于同样的原因,我在选择列表中收到错误,说明SchoolID无效。

我在这里缺少什么?

3 个答案:

答案 0 :(得分:2)

with cte as (SELECT  *,
                ROW_NUMBER() OVER(PARTITION BY PersonID 
                                  ORDER BY EndDate DESC)  AS RN
        FROM Table1)
select PersonId, SchoolId, EndDate from cte
where RN = 1

请参阅SqlFiddle

答案 1 :(得分:0)

您必须将MAX(Date)包装在子查询中。

SELECT SchoolID, PersonID, Date
FROM table1 t
WHERE Date =
    (SELECT MAX(Date) FROM table1
    WHERE PersonID = t.PersonID);

注意:如果有多个日期与最大值绑定,则会为一个PersonID提供多行

答案 2 :(得分:0)

      with temp as
      (
       SELECT PersonID,MAX(EndDate) as enddate FROM TABLE
       GROUP BY PersonID
      )
       select TABLE.* from TABLE inner join  temp on TABLE.personid=temp.personid
and  TABLE.enddate=temp.enddate;