我想针对每个标签针对不同的产品类别挑选出最畅销的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属于同一类别。我要代替product4。如何在SQL Server中执行此操作?
第一个ROW_NUMBER删除每个标签和product_category的重复行,第二个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
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