0

関心のある 3 つのテーブルと、それらから次の出力を生成するクエリがあります。各フィールドには、デモンストレーションのために元のテーブルを表す文字が先頭に追加されます。代わりに、最新のデータのみを含むレポートが必要です。つまり、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

DBMS に SQL Server を使用しています。

4

1 に答える 1

1

最も簡単な方法は を使用することROW_NUMBER()です (簡単にするために aを使用しています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;
于 2012-03-28T20:24:22.063 に答える