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;
逻辑说明
CTE(公共表表达式)
RankedResults:- 保留你原查询的所有筛选条件,同时新增
ROW_NUMBER()窗口函数。 PARTITION BY t1.ArticleNr:将查询结果按产品编号ArticleNr分组,每个组独立计算序号。ORDER BY t2.Ranking ASC:确保每个组内的记录按Ranking从小到大排序,这样Ranking最低的记录会被分配序号1。
- 保留你原查询的所有筛选条件,同时新增
外层筛选:
- 通过
WHERE rn = 1,只保留每个产品组内序号为1的记录,也就是每个产品的最优适配位置。
- 通过
额外优化建议
我把原查询的隐式连接(FROM #Info t1, #Dimensions t2)改成了显式的INNER JOIN,这是SQL的最佳实践之一,能让查询逻辑更清晰,避免意外的笛卡尔积问题。
按照这个调整,你的查询就会输出符合期望的结果:每个产品仅返回Ranking最低的那条记录。
内容的提问来源于stack exchange,提问作者TheNiers
相关产品推荐
相关产品推荐

