按组分别选择具有最大日期的记录

时间:2012-03-28 20:19:41

标签: sql sql-server tsql join having-clause

我有三个值得关注的表和一个从它们生成以下输出的查询,其中每个字段前面都有一个代表原始表的字母用于演示目的。我想要的是一个只包含最新数据的报告,即我只想要用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。

1 个答案:

答案 0 :(得分: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;
相关问题