SQL技术求助:同款式商品分组后取优先级1的记录(不使用TOP 1)
解决同款式商品分组并仅保留优先级1记录的方案
我懂你现在的需求:手里有一批同款式但不同供应商的商品,关联着两张靠优先级绑定的表,用户多选商品时,得把同款式的归为一组,只留优先级为1的那条记录,还不能用TOP 1对吧?
这里给你两个靠谱的实现思路,结合你的表变量@ItemKeys来写:
方法1:用窗口函数ROW_NUMBER()(推荐)
这个方法能精准按款式分组,给每组内的记录按优先级排序,然后筛选出每组的第一条(也就是优先级1的那条),完全避开TOP 1:
DECLARE @ItemKeys dbo.Ids; INSERT INTO @ItemKeys Values (242), (243), (244); -- 补充你实际的ItemKey值 WITH RankedProducts AS ( SELECT -- 替换成你实际需要查询的字段,比如商品ID、款式、供应商、优先级等 p.ItemKey, p.Style, s.SupplierName, p.Priority, -- 按款式分组,同款式内按优先级升序排序(1排最前面) ROW_NUMBER() OVER (PARTITION BY p.Style ORDER BY p.Priority ASC) AS RowRank FROM YourProductTable p -- 替换成你的商品主表名 JOIN YourSupplierTable s -- 替换成你的关联表名 ON p.SupplierId = s.SupplierId -- 替换成实际的关联字段 WHERE p.ItemKey IN (SELECT Id FROM @ItemKeys) ) -- 只取每组的第一条(优先级1的记录) SELECT ItemKey, Style, SupplierName, Priority FROM RankedProducts WHERE RowRank = 1;
为什么这个方法可行?
PARTITION BY p.Style:把所有商品按款式拆分成独立的组,同款式的会被分到一组里ORDER BY p.Priority ASC:在每个组内按优先级从小到大排序,这样优先级1的记录会被标记为RowRank=1- 最后筛选
RowRank=1,就能得到每个款式下优先级最高的那条记录
方法2:用NOT EXISTS子查询
如果你的场景里每个款式只会有一条优先级为1的记录,也可以用NOT EXISTS来实现,逻辑是:只保留同款式中没有比它优先级更高的记录(也就是优先级1的那条):
DECLARE @ItemKeys dbo.Ids; INSERT INTO @ItemKeys Values (242), (243), (244); SELECT p.ItemKey, p.Style, s.SupplierName, p.Priority FROM YourProductTable p JOIN YourSupplierTable s ON p.SupplierId = s.SupplierId WHERE p.ItemKey IN (SELECT Id FROM @ItemKeys) AND NOT EXISTS ( SELECT 1 FROM YourProductTable p2 WHERE p2.Style = p.Style AND p2.ItemKey IN (SELECT Id FROM @ItemKeys) AND p2.Priority < p.Priority -- 找同款式中优先级更小(更高)的记录,找不到就说明当前是最高优先级 );
注意点
- 如果你的优先级规则是数字越大优先级越高,记得把
ORDER BY或NOT EXISTS里的比较符号反过来(比如ORDER BY p.Priority DESC、p2.Priority > p.Priority) - 替换代码里的表名、字段名,匹配你实际的数据库结构就行
内容的提问来源于stack exchange,提问作者Raeesa A
相关产品推荐
相关产品推荐

