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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:09:01