在SQL GROUP BY查询中,非聚合列使用了什么值?

时间:2011-02-28 15:20:47

标签: sql

假设我从SQL查询中获得了以下数据:

Lastname Firstname Age
Anderson Jane      28
Anderson Lisa      22
Anderson Jack      37

如果我想知道最后一个姓Anderson的人的年龄,我可以选择MAX(年龄)和GROUP BY姓氏。但我也想知道那个最老的人的名字。当GROUP BY将Firstname值折叠成一行时,我如何确保从我获得最大年龄的同一行中获取Firstname值?

3 个答案:

答案 0 :(得分:3)

对于那些支持它的RDBMS(例如,SQL Server 2005+),您可以使用窗口函数:

select t.Lastname, t.Firstname, t.Age
    from (select Lastname, Firstname, Age, 
                 row_number() over (partition by Lastname order by Age desc) as RowNum
              from YourTable
         ) t
    where t.RowNum = 1

对于其他人,您需要在Lastname上使用子查询,并在连接中获取Firstname:

select yt.Lastname, yt.Firstname, yt.Age
    from YourTable yt
        inner join (select LastName, max(Age) as MaxAge
                        from YourTable
                        group by LastName) q
            on yt.Lastname = q.Lastname
                and yt.Age = q.MaxAge

答案 1 :(得分:2)

您必须从分组结果中重新加入表格 - 即创建一个视图或嵌套查询以包含该组。

答案 2 :(得分:0)

对于任何方法,您需要注意的主要事项是,对于给定的firstname,可能存在超过1 lastname且年龄相同。

此查询只返回1行,但如果您的数据集中有多个37岁的“Anderson”,则可以返回任一个:

select firstname, age
from yourtable
where lastname = 'Anderson'
order by age desc limit 1