如何获得每组的第一行?

Posted

技术标签:

【中文标题】如何获得每组的第一行?【英文标题】: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          |
+-----+-------------+-------------+

我该怎么做?

【问题讨论】:

【参考方案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 生成一个数字,这意味着您可以通过它找到最大的num。 dev.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;

【讨论】:

以上是关于如何获得每组的第一行?的主要内容,如果未能解决你的问题,请参考以下文章

如何选择每组的第一行?

如何根据多个排序列选择每组的第一行?

如何将熊猫数据框值除以每组的第一行?

如何根据特定的顺序选择每组的第一行?

从每组的第一行和最后一行获取值

赛马题