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

SQL Server优化查询:按ArticleNr返回最低Ranking的单条记录

解决每个产品仅返回最低Ranking记录的SQL调整方案

要实现每个ArticleNr只返回Ranking最低的适配记录,我们可以利用窗口函数来精准筛选每个产品组内的最优结果,具体调整如下:

修改后的查询语句

WITH RankedResults AS (
    SELECT 
        t1.ArticleNr, 
        t1.Location AS Location, 
        t1.StorageMedium AS Packaging, 
        t1.StockAtLocation, 
        t2.Verpakking AS NewPackaging, 
        t2.Ranking,
        -- 给每个ArticleNr分组,按Ranking升序分配序号
        ROW_NUMBER() OVER (PARTITION BY t1.ArticleNr ORDER BY t2.Ranking ASC) AS rn
    FROM #Info t1
    INNER JOIN #Dimensions t2
        ON t1.Length < t2.Lengte 
        AND t1.Width < t2.Breedte 
        AND t1.Height < t2.Hoogte 
        AND t1.Volume < t2.MaxVol 
        AND (t1.PartWeightGross / 1000) < t2.MaxWeightArt 
        AND (t1.Volume * t1.StockAtLocation) < t2.MaxVol 
        AND ((t1.PartWeightGross / 1000) * t1.StockAtLocation) < t2.MaxWeightEmb
)
SELECT 
    ArticleNr, 
    Location, 
    Packaging, 
    StockAtLocation, 
    NewPackaging, 
    Ranking
FROM RankedResults
WHERE rn = 1 -- 只保留每个产品组内排名第一(Ranking最低)的记录
ORDER BY ArticleNr ASC;

逻辑说明

  1. CTE(公共表表达式)RankedResults:

    • 保留你原查询的所有筛选条件,同时新增ROW_NUMBER()窗口函数。
    • PARTITION BY t1.ArticleNr:将查询结果按产品编号ArticleNr分组,每个组独立计算序号。
    • ORDER BY t2.Ranking ASC:确保每个组内的记录按Ranking从小到大排序,这样Ranking最低的记录会被分配序号1。
  2. 外层筛选:

    • 通过WHERE rn = 1,只保留每个产品组内序号为1的记录,也就是每个产品的最优适配位置。

额外优化建议

我把原查询的隐式连接(FROM #Info t1, #Dimensions t2)改成了显式的INNER JOIN,这是SQL的最佳实践之一,能让查询逻辑更清晰,避免意外的笛卡尔积问题。

按照这个调整,你的查询就会输出符合期望的结果:每个产品仅返回Ranking最低的那条记录。

内容的提问来源于stack exchange,提问作者TheNiers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:18:54