You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:47:57