MS SQL查询优化:按Part_number分组取最新Document_Date对应Unit_Price
优化MS SQL多表连接查询:按Part_Number分组取最新Document_Date的Unit_Price
嘿,我正好处理过类似的需求,给你整理了最优的解决方案——完全保留你原有的5表连接逻辑,同时实现按Part_Number分组、获取每组对应最新Document_Date的Unit_Price的功能:
核心思路
- 先保留你原本的5表关联逻辑,确保能拿到所有需要的基础字段
- 用窗口函数
ROW_NUMBER()按Part_Number分组,再按Document_Date降序排序,这样每组里最新日期的那条数据会被标记为1 - 最后筛选出标记为
1的记录,就是我们要的目标结果
方案一:用CTE(通用表表达式)实现(推荐,可读性高)
WITH RankedProducts AS ( -- 👇这里替换成你实际的5表连接逻辑和字段 SELECT p.Part_Number, d.Document_Date, up.Unit_Price, -- 其他你需要保留的业务字段都放在这里 -- 按Part_Number分组,每组内按Document_Date倒序排,最新的记录rn=1 ROW_NUMBER() OVER (PARTITION BY p.Part_Number ORDER BY d.Document_Date DESC) AS rn FROM TableA p JOIN TableB b ON p.ID = b.PartID JOIN TableC c ON b.CategoryID = c.ID JOIN TableD d ON p.DocumentID = d.ID JOIN TableE up ON p.PriceID = up.ID ) SELECT Part_Number, Document_Date, Unit_Price -- 其他需要的业务字段 FROM RankedProducts WHERE rn = 1;
方案二:子查询实现(兼容老版本SQL Server)
如果你的SQL Server版本偏老(虽然CTE在2008及以后就支持了),可以用子查询替代:
SELECT Part_Number, Document_Date, Unit_Price -- 其他需要的业务字段 FROM ( -- 👇同样替换成你实际的5表连接逻辑 SELECT p.Part_Number, d.Document_Date, up.Unit_Price, ROW_NUMBER() OVER (PARTITION BY p.Part_Number ORDER BY d.Document_Date DESC) AS rn FROM TableA p JOIN TableB b ON p.ID = b.PartID JOIN TableC c ON b.CategoryID = c.ID JOIN TableD d ON p.DocumentID = d.ID JOIN TableE up ON p.PriceID = up.ID ) AS SubQuery WHERE rn = 1;
注意事项
- 若同一个
Part_Number存在多条**相同最新Document_Date**的记录:- 用
ROW_NUMBER()会随机保留一条; - 若要保留所有同日期的记录,把
ROW_NUMBER()换成RANK()或DENSE_RANK()即可
- 用
- 建议给
Part_Number和Document_Date字段添加联合索引,能大幅提升分组排序的查询性能 - 确保你的多表连接条件正确,避免出现笛卡尔积导致数据冗余或性能问题
内容的提问来源于stack exchange,提问作者ultrashock
相关产品推荐
相关产品推荐

