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