SQL-使用条件选择每组前 3 个值

标签 sql sql-server greatest-n-per-group

我想针对每个标签的不同产品类别提取前 3 名最畅销的产品。 数据如下所示:

tag  | product_name | product_category | order_count
tag1 | product1     | category1        | 100
tag1 | product2     | category2        | 80
tag1 | product3     | category2        | 60
tag1 | product4     | category3        | 50
......

我知道如何使用 ROW_NUMBER() 提取每个标签的前 3 个畅销产品,但它将返回 Product1、product2、product3。我不想要product3,因为它与product2属于同一类别。我想要产品 4。如何在 SQL Server 中执行此操作?

最佳答案

第一个 ROW_NUMBER 删除每个标签和产品类别的重复行,第二个 ROW_NUMBER 选择每个标签最畅销的 3 个产品

;WITH cte AS
 (SELECT *, ROW_NUMBER() OVER(PARTITION BY tag, product_category ORDER BY order_count DESC) AS rn
  FROM yourtable
  ), cte2 AS
  (SELECT *, ROW_NUMBER() OVER(PARTITION BY tag ORDER BY order_count DESC) AS rn2
   FROM cte
   WHERE rn = 1
   )
   SELECT *
   FROM cte2
   WHERE rn2 <= 3

演示 SQLFiddle

下一个使用派生表

;WITH cte AS
 (SELECT t2.tag, t2.product_name, t2.product_category, t2.order_count,
         ROW_NUMBER() OVER(PARTITION BY t2.tag ORDER BY order_count DESC) AS rn
  FROM (SELECT tag, product_category, MAX(order_count) AS maxCount
        FROM yourtable
        GROUP BY tag, product_category
        ) t1 JOIN yourtable t2 ON t1.tag = t2.tag 
          AND t1.product_category = t2.product_category
          AND maxCount = order_count
  )
  SELECT *
  FROM cte
  WHERE rn <= 3

演示 SQLFiddle

关于SQL-使用条件选择每组前 3 个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19737373/

相关文章:

Mysql优化避免表扫描

mysql - sql选择在第二个表中没有关系的记录

java - 使用具有字符串的额外列将数据从一个 Mysql 表传输到另一个表

MySQL Multiple JOIN,其中一个最近的时间戳

选择查询中的 SQL 条件变量

javascript - 是否有 mongo 替换方法/运算符?

sql - 无法写入属性 IsFileStream

sql - 范围和分配单元之间有什么区别/关系?

sql - 在 SQL Server 中使用 CTE 查询进行递归匹配

sql - 每组最大 n 个 SQL 查询的高性能方法