2011-02-28 46 views
2

說我已經得到了以下數據從SQL查詢回:在SQL GROUP BY查詢中,爲非聚合列使用了什麼值?

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

如果我想知道最古老的人與姓氏安德森的年齡,我可以選擇MAX(年齡)和GROUP BY姓。但我也想知道那個最老的人的名字。我怎樣才能確保,當通過GROUP BY將Firstname值摺疊爲一行時,我從同一行獲取Firstname值,並獲得最大年齡?

+1

你的「最大年齡」並非來自一個特定的行,因爲它是一個聚合。想一想當你有另一排('安德森','鮑勃',37)在你的集合中的情況 - '最大(年齡)'仍然是37,但是哪一排是從哪裏來的? – 2011-02-28 16:18:38

回答

2

您必須從分組結果中返回表格 - 即創建視圖或嵌套查詢以包含組。

3

對於那些支持它的RDBMS(如SQL服務器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 

對於其他人來說,你需要在姓氏子查詢和聯接拿到姓:

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行或更多行之間共享,則第一個示例將只返回一個(不可預知),而第二個示例將返回多行 – 2011-02-28 16:01:38

0

你需要注意什麼你的方法的主要問題是,有可能是超過1firstname與同年齡對於一個給定lastname

這個查詢將返回僅1行,但如果你的數據集有一個以上的「安德森現年37歲,就可以返回任何一個:

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