如何获得每组的第一行?
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()
获取最大值num
和FIRST_VALUE()
获取最大值business_id
的num
:
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;
【讨论】:
以上是关于如何获得每组的第一行?的主要内容,如果未能解决你的问题,请参考以下文章