如何获得每组的第一行?
How to get the first row per group?
我有这样的查询:
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 版本支持 ROW_NUMBER
+ window 功能,你可以尝试使用 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
使用 window 函数 MAX()
得到最大值 num
和 FIRST_VALUE()
得到最大值 num
的 business_id
:
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;
我有这样的查询:
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 版本支持 ROW_NUMBER
+ window 功能,你可以尝试使用 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 |
使用 window 函数 MAX()
得到最大值 num
和 FIRST_VALUE()
得到最大值 num
的 business_id
:
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;