簡體   English   中英

SQL Server-獲取最新的聯接記錄

[英]SQL server - Get newest record of join

在閱讀了Stackoverflow一段時間之后,今天輪到我來提一個問題!

表結構
它與對SQL Server 2005數據庫的查詢有關。 我具有以下表結構:

組件

  • ID

資料下載

  • ID
  • componentid(從FK到components#id)
  • 下載日期

進口

  • ID
  • downloadid(從FK到downloads#id)
  • 狀態

我想得到什么
我正在嘗試獲取每個組件的最新下載狀態。

到目前為止我在哪里
我已經開始編寫此查詢,但是我的聯接工作得不太好:

SELECT c.id  
FROM components as c  
JOIN (    
  SELECT componentid, MAX(downloaddate) as downloaddate, id  
  FROM downloads  
  GROUP BY componentid, id   
) d ON d.componentid = c.id  
-- JOIN on imports here...

我的問題是用於聯接的查詢不正確。 因為我需要選擇連接的ID,所以將其添加到group by子句中,現在我獲得了每個componentid的多個記錄,而不是最新的記錄。

這是我自己在聯接中執行查詢時得到的結果。

componentid downloaddate            id

8882    2011-01-15 06:00:09.773 595862
8882    2011-01-16 06:00:09.847 598422
8882    2011-01-17 06:00:09.940 600971
8951    2010-11-15 03:00:22.550 450221
8951    2010-11-16 03:00:21.730 452431
8951    2010-11-17 03:00:21.920 454668
8961    2011-01-17 02:00:33.077 600532
8961    2011-01-17 02:00:59.070 600536
8983    2008-07-17 11:59:53.780 122
9005    2009-09-01 04:00:38.320 48918
9005    2009-09-02 04:00:36.260 49280

相反,我需要這樣的東西:

componentid downloaddate            id

8882    2011-01-17 06:00:09.940 600971
8951    2010-11-17 03:00:21.920 454668
8961    2011-01-17 02:00:59.070 600536
8983    2008-07-17 11:59:53.780 122
9005    2009-09-02 04:00:36.260 49280

有誰知道我應該怎么寫我的聯接來達到預期的結果?

在此先多謝

您無法關聯JOIN運算符。 改用APPLY:

SELECT c.id , d.downloaddate
FROM components as c  
APPLY (    
  SELECT componentid, MAX(downloaddate) as downloaddate  
  FROM downloads  
  WHERE componentid = c.id
) as d;

實際上,您也可以使用JOIN(因為內部查詢實際上沒有關聯),但不要按id分組,而按componentid分組:

SELECT c.id , d.downloaddate
FROM components as c  
JOIN (    
  SELECT componentid, MAX(downloaddate) as downloaddate  
  FROM downloads  
  GROUP BY componentid 
) as d ON c.id = d.componentid;

更新時間

SELECT *
FROM components as c  
APPLY (    
  SELECT TOP(1) componentid, downloaddate, id as downloadid
  FROM downloads  
  WHERE componentid = c.id
  ORDER BY downloaddate DESC
) as d
JOIN imports i on i.id = d.downloadid;

您可能可以使用ROW_NUMBER函數解決此問題:

SELECT componentid, ROW_NUMBER() OVER (PARTITION BY componentid ORDER BY downloaddate DESC) as rowno
FROM downloads  
WHERE rowno = 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM