SQL Server数据仓库左连接后获取单条最新记录的实现求助
解决方案
可以使用**窗口函数ROW_NUMBER()**实现需求,核心逻辑是先对ONT.OE_Order_Price_Attribs表按Header_Id、Line_Id、Last_Update_Date分组,在每组内按Order_Price_Attrib_Id降序排序,标记出每组的第一条记录(即ID最大的那条),再与基础表关联。
完整SQL语句
SELECT OL.*, OPA_filtered.* FROM ONT.OE_Order_Lines_All OL LEFT JOIN ( SELECT *, -- 按分组排序,标记每组内ID最大的记录为行号1 ROW_NUMBER() OVER ( PARTITION BY Header_Id, Line_Id, Last_Update_Date ORDER BY Order_Price_Attrib_Id DESC ) AS rn FROM ONT.OE_Order_Price_Attribs ) OPA_filtered ON OL.Header_Id = OPA_filtered.Header_Id AND OL.Line_Id = OPA_filtered.Line_Id -- 只保留每组内的第一条记录(ID最大的) AND OPA_filtered.rn = 1
逻辑说明
- 子查询中通过
PARTITION BY Header_Id, Line_Id, Last_Update_Date将OPA表的数据按这三个字段分组,确保同一组内是需要去重的重复记录。 ORDER BY Order_Price_Attrib_Id DESC让每组内Order_Price_Attrib_Id最大的记录排在最前面,行号标记为1。- 外层关联时只取行号为1的记录,这样每个
Header_Id+Line_Id+Last_Update_Date组合只会保留一条ID最大的记录,同时完整保留所有att*列的数据。 - 保持
LEFT JOIN确保即使OPA表中没有对应记录,OL表的记录也会被保留,与原关联逻辑一致。
内容的提问来源于stack exchange,提问作者Yoeri
相关产品推荐
相关产品推荐

