2012-03-28 112 views
0

我有三個關注的表和一個查詢,它們從它們生成以下輸出,其中每個字段前面都有一個字母,代表用於演示目的的原始表。我想要的只是一個只包含最新數據的報告,即我只想用MAX(EntryDate)返回的行,但我無法弄清楚如何完成此操作。我試過了,HAVING,聚合等,但沒有成功。無論我的方法是錯誤的,還是我在語法上缺失了某些東西。分別按最大日期分組選擇記錄

s.ID r.FirstID m.ID m.PartNum  m.Revision  r.EntryDate 
26  42   13  NULL   A    2012-03-25 15:32:00 
26  42   17  820044444  B    2012-03-27 09:48:00 
26  42   14  820056789  C    2012-03-28 12:19:00 

所需的結果:

s.ID r.FirstID m.ID m.PartNum  m.Revision  r.EntryDate 
26  42   14  820056789  C    2012-03-28 12:19:00 

對於一些額外的背景下,r.FirstID代表所有彼此相關記錄的分組,所以爲每個分組我只希望在返回記錄最新的數據。

這裏是我的查詢,我至今:

select s.ID,r.FirstID,m.ID,m.PartNum,m.Revision,r.EntryDate from StatusLog s 
    left join (select FirstID,PartInfoID from Request where PartInfoID is not null group by FirstID,PartInfoID) r on s.FirstID= r.FirstID 
    --required filtering here? Or move this extra join to the inner query? 
    left join PartInfo m on r.PartInfoID = m.ID 

我使用的是SQL Server以我的DBMS。

回答

1

最簡單的方法是使用ROW_NUMBER()(爲簡單起見,我使用的是CTE)。讓我知道如果你需要我解釋這裏發生了什麼:)

WITH myCTE 
AS 
(
    SELECT s.ID AS sID, r.FirstID, m.ID AS mID, m.PartNum, m.Revision, 
     r.EntryDate, 
     ROW_NUMBER() OVER 
      (PARTITION BY r.FirstID ORDER BY r.EntryDate DESC) AS RowNumber 
    FROM StatusLog s 
     LEFT JOIN 
     (
      SELECT FirstID, PartInfoID 
      FROM Request 
      WHERE PartInfoID IS NOT NULL 
      GROUP BY FirstID,PartInfoID 
     ) AS r 
      ON s.FirstID= r.FirstID 
     LEFT JOIN PartInfo m 
      ON r.PartInfoID = m.ID 
) 
SELECT sID,FirstID,mID,PartNum,Revision,EntryDate 
FROM myCTE 
WHERE RowNumber = 1; 
+0

沒有先生,這隻適用於特定情況。請重新閱讀我的問題。我強調了關鍵點。我需要它返回一個結果集,**由r.FirstID'字段確定的每個組**的一行**。 – Chiramisu 2012-03-28 20:27:51

+0

@Chiramisu好的,修復:)我只需要從ROW_NUMBER()GROUP BY中刪除s.ID。這應該現在工作。我也注意到我的ORDER BY是不正確的,所以把它改爲DESC :) – 2012-03-28 20:30:01

+0

我不認爲你可以使用'ROW_NUMBER()OVER(GROUP BY)',我認爲你的意思是'ROW_NUMBER()OVER(PARTITION BY')對嗎? – Arion 2012-03-28 20:34:32

相關問題