我想针对每个标签的不同产品类别提取前 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/