2013-08-27 62 views
1

我在我的SQL數據庫中有一個名爲MediaGenT的表,其中有425000條記錄。但是,列名稱mg_medianum具有重複的條目。例如,mg_medianum ='858'有10個不同的記錄,但我只對mg_createdate可以排序的最新記錄感興趣。SQL查詢中的不同子句

當我這樣做,我得到425000條記錄:

Select * from MediaGenT 
    Order By mg_createdate; 

當我這樣做,我得到89000條記錄(正確的,但只顯示一列):

Select distinct mg_medianum from MediaGenT 
    Order by mg_createdate; 

總之我需要什麼是一個查詢,顯示89000記錄的每一列,只顯示mg_createdate排序的最新的不同mg_medianum。我很難提出這種查詢的語法。

+1

您正在使用哪個數據庫管理系統?甲骨文? Postgres的? –

回答

1

你需要一個稍微複雜的查詢:

select mgt.* 
from MediaGenT mgt join 
    (select mg_medianum, max(mg_createdate) as maxcd 
     from MediaGenT 
     group by mg_medianum 
    ) msum 
    on mgt.mg_medianum = msum.mg_medianum and mgt.mg_createdate = msum.maxcd; 

也就是說,計算最近的每個媒體NUM日期,然後選擇該記錄。

這是可在任何數據庫中工作的標準SQL。

編輯:

上述查詢被計算爲每個媒體數的最大的日期和調用它msum.maxcd。該查詢使用此查詢來僅選擇每個媒體編號的最大日期(通過join)。 mgt.*表達式選擇MediaGenT表中的所有列。

+0

感謝戈登這工作正常。你能解釋一下mgt。*背後的意義嗎?它的目的是什麼? maxcd在這方面還有什麼作用? – user2722215

0
​​
+1

哪個SQL語言具有'qualify'語法?看起來很有趣 –

+0

@a_horse_with_no_name好像是[Teradata語法](http://www.ssistalk.com/2010/02/10/sql-server-do-you-want-to-qualify-your-results/) –

+0

是的,它主要是Teradat語法。 –

0

這只是一個最大的每組查詢。戈登提出了另一種選擇。另一種是使用左連接:

select t1.* from MediaGenT t1 
left join MediaGenT t2 on 
t1.mg_medianum = t2.mgmedianum and t1.mg_createdate < t2.mg_createdate 
where t2.mg_createdate is null 

兩個查詢的效率可以依賴於表的數據分佈和所用的DBMS變化。

1

這個可能比Gordon的解決方案更快,因爲只需要在桌上掃描一次。

select mg_medianum, mg_createdate 
from (
    select mg_medianum, 
      mg_createdate, 
      max(mg_createdate) over (partition by mg_medianum) as max_created 
    from MediaGenT 
) t 
where mg_createdate = max_created; 

這是ANSI SQL,並適用於所有現代DBMS