【问题标题】:How to get the first row per group?如何获得每组的第一行?
【发布时间】:2022-01-01 13:48:52
【问题描述】:

我有一个这样的查询:

select count(1) num, business_id, category_id
from mytable
group by business_id, category_id
order by num desc

结果如下:

// res
+-----+-------------+-------------+
| num | business_id | category_id |
+-----+-------------+-------------+
| 22  | 5543        | 8           |
| 19  | 4352        | 8           |
| 13  | 3242        | 11          |
| 10  | 2132        | 11          |
| 7   | 6832        | 8           |
+-----+-------------+-------------+

现在我想获取每个category_id 的第一行。所以它一定是最大的num和它的business_id。所以预期的结果是:

// expected res
+-----+-------------+-------------+
| num | business_id | category_id |
+-----+-------------+-------------+
| 22  | 5543        | 8           |
| 13  | 3242        | 11          |
+-----+-------------+-------------+

我该怎么做?

【问题讨论】:

    标签: mysql sql group-by sql-order-by window-functions


    【解决方案1】:

    如果你的 MySQL 版本支持ROW_NUMBER + 窗口函数,你可以尝试使用ROW_NUMBER 得到最大的num by category_id

    查询 #1

    SELECT num,business_id,category_id
    FROM (
        SELECT *,ROW_NUMBER() OVER(PARTITION BY category_id ORDER BY num desc) rn
        FROM (
            select count(1) num, business_id, category_id
            from mytable
            group by business_id, category_id
        ) t1
    ) t1
    WHERE rn = 1
    
    num business_id category_id
    22 5543 8
    13 3242 11

    View on DB Fiddle

    【讨论】:

    • 我明白了,谢谢.. 我现在去看看.. 只是,rn 代表什么?
    • rn 作为 SELECT 子句结果的别名 - 大概代表行号,如:行数。
    • @MartinAJ ROW_NUMBER 窗口函数将为order by 生成一个数字,这意味着您可以通过它找到最大的numdev.mysql.com/doc/refman/8.0/en/…
    • 我看到@D-Shih,谢谢。另外,两个不同的表别名可以使用两次t1吗?
    • @MartinAJ 因为ROW_NUMBER 不能以 where 子句为条件
    【解决方案2】:

    使用窗口函数MAX() 获取最大值numFIRST_VALUE() 获取最大值business_idnum

    SELECT DISTINCT 
           MAX(COUNT(*)) OVER (PARTITION BY category_id) num, 
           FIRST_VALUE(business_id) OVER (PARTITION BY category_id ORDER BY COUNT(*) DESC) business_id, 
           category_id
    FROM mytable
    GROUP BY business_id, category_id
    ORDER BY num DESC;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      • 2016-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多