SQL按最大值选择组

时间:2014-04-15 03:13:48

标签: sql sql-server group-by

有人可以给我一个select语句,只检索每个用户具有最高(最大)年份的行吗?

Year    User_ID   Name     City
=====   =======   =====    =====
2001    1         Bob      Mpls
2002    1         Bob      Mpls
2003    1         Bob      St Paul
2005    2         Mary     New York
2010    2         Mary     L.A.

...所以我想要的结果集是:

Year    User_ID   Name   City
=====   =======   ====   =====
2003    1         Bob    St Paul
2010    2         Mary   L.A.

5 个答案:

答案 0 :(得分:2)

由于您没有提及任何RDBMS,因此该查询几乎适用于所有RDBMS。

SELECT  a.*
FROM    TableName a
        INNER JOIN
        (
            SELECT  Name, MAX(Year) Year
            FROM    TableName 
            GROUP   BY Name
        ) b ON  a.Name = b.Name
                AND a.Year = b.Year

但是,如果您的RDBMS支持窗口函数,则可以使用ROW_NUMBER()

SELECT  Year, User_ID, Name
FROM    
        (
            SELECT  Year, User_ID, Name,
                    ROW_NUMBER() OVER (PARTITION BY Name,
                                        ORDER BY Year DESC) rn
            FROM    TableName
        ) x
WHERE   x.rn = 1

答案 1 :(得分:1)

SELECT * 
  FROM Table a
  WHERE a.Year = (
                    SELECT TOP 1 Year 
                       FROM Table b 
                       WHERE a.name = b.name 
                       ORDER BY year DESC
                  )

不是我所知道的最好但很简单

答案 2 :(得分:0)

这应该有效:

SELECT MAX( Year ) Year, User_id, Name
FROM tableName
GROUP BY User_id, Name

答案 3 :(得分:0)

如果您告诉我们您正在使用的数据库,我可能会建议稍微好一点的查询,但这个很简单,应该适用于大多数数据库:

SELECT MAX(year), user_id, name
FROM myTable
GROUP BY user_id, name

答案 4 :(得分:0)

您可以按分组来实现结果,请参阅下面的示例。

    create table #temp(year int,id int,name varchar(5),city varchar(20))
insert into #temp values (2001,1,'Bob','Mpls')
insert into  #temp values (2002,1,'Bob','Mpls')
insert into  #temp values  (2003,1,'Bob','St Paul')
insert into  #temp values  (2005,2,'Mary','New York')
insert into  #temp values  (2010,2,'Mary','L.A.')

您可以选择使用此查询

 SELECT  t.year,t.id,t.Name,t.city
FROM    #temp t
        INNER JOIN
        (
            SELECT  Name, MAX(Year) Year
            FROM    #temp 
            GROUP   BY Name
        ) a ON  t.Name = a.Name
                AND t.Year = a.Year