2010-05-19 48 views
0

給定表USER(名稱,城市,年齡),獲取每個城市最舊用戶的用戶詳細信息的最佳方式是什麼?用於獲取與聚合匹配的行(不是組)的SQL(獲取行數)

我已經看到了甲骨文使用下面的例子SQL,我認爲它的工作原理

select name, city, age 
from USER, (select city as maxCity, max(age) as maxAge 
      from USER 
      group by city) 
where city=maxCity and age=maxAge 

因此,在本質:使用嵌套查詢來爲它選擇的分組鍵和聚合,然後用它作爲另一個表在主要查詢中並使用分組鍵和每個鍵的聚合值進行連接。

這是SQL的標準方式嗎?它是否比使用臨時表更快,或者實際上是使用臨時表呢?

回答

0

儘管它顯示所有共享最大使用時間的用戶,但您正在使用的功能仍然有效。

您可以使用row_number()排名功能稍微更可讀的方式做到這一點:

select name, city, age 
from (
    select 
     city 
    , age 
    , row_number() over (partition by city order by age) as rn 
    from USER 
) sub 
where rn = 1 

這也將選擇每個城市最多一個用戶。

大多數數據庫系統將使用臨時表來存儲內部查詢。所以我不認爲臨時桌子會加快速度。但數據庫性能是出了名的難以從遠處預測:)

+0

對,這也適用於oracle(除了在子查詢錯字中丟失「名稱」),所以我猜row_number()和分區是標準的SQL? (我的意思是,我將能夠在sybase和MySQL中使用它們) 另外我想確認在FROM子句中使用子查詢是否標準和便攜 在我的情況下,我希望獲得所有匹配的行,所以我會堅持我的選擇,但這也是一個很好的選擇。 – user265454 2010-05-19 11:50:33

+0

@xulochavez:FROM子句中的子查詢非常便於攜帶。排名功能不是,我認爲它們僅限於SQL Server,Oracle和PostgreSQL。絕對不是MySQL – Andomar 2010-05-19 12:55:50