当前位置: 首页 > 面试题库 >

SQL选择每组WITH CONDITION的前3个值

申思远
2023-03-14
问题内容

我想针对每个标签针对不同的产品类别挑选出最畅销的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

下一个使用派生表

;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



 类似资料:
  • 问题内容: 我有一张桌子,如下所示: 这是样本 的汇总功能仅允许我获得每个方面的最高分。我想查询以获得每个人的最高2分,我该怎么办? 我的预期输出是 问题答案: SQLFiddle演示

  • 问题内容: 我有一个包含69个表的数据库,我只想选择每个表的前三个记录。 我可以在 每个表 上执行以下操作: 但是,如果我要手动执行此操作,则将花费大量时间。 您能建议一个解决方法吗? 我尝试了此解决方案,但可以使其正常工作(我不知道如何针对MSSQL对其进行修改) 编辑 感谢您的答复。我可能还不够清楚:我的意思是我想解析每个单独的表,并且只获得前3个记录,而不是转到下一个表。以下是我需要的Yar

  • 问题内容: 我已阅读这篇文章:http : //www.xaprb.com/blog/2006/12/07/how- to-select-the-firstleastmax-row-per-group-in- sql/ 并搜索其他问题 我有一个像这样的表: 我正在尝试获取按user.id分组的table.id的计数,如果user.id的计数大于7,则仅将结果显示为7(也就是将计数结果限制为7)。

  • 问题内容: 我有这张表 language_id是指记录所用的语言。我想做的是检索 每个language_id中 最近的五个记录(ORDER BY time_posted DESC LIMIT 5)的列表。我可以使用许多不同的SQL查询在PHP中循环执行此操作,但我觉得有一种更简单的方法。 我必须得到一本有关SQL的书,哈哈。 谢谢。 问题答案: 这是我在MySQL中解决此“每组前N个”类型的查询的

  • 问题内容: 我们只是在一个旧的生产存储过程中遇到了这个问题(这里还有很多事情要做,但这只是其逻辑的一部分)。为什么有人会从表中选择前0行?这是我不熟悉的某种SQL hack或技巧吗? 问题答案: 在UNION ALL中命名列 请务必也阅读Alex K.的答案。我也曾用过很多原因。这只是最明显的一个。

  • 问题内容: 我试图从看起来像这样的数据库表结果中选择前2条记录 我试过这个查询 但是有些主题,例如失踪的地方,我什至尝试了以下链接的建议 如何选择每个组的前N行? 但是我为每个受检者得到两个以上 我究竟做错了什么? 问题答案: 您可以使用相关的子查询: 该查询通过串联三列来构造单列主键。如果您有真正的主键(如),则可以用代替。 SQL Fiddle中的示例。