如何获得每组的第一行?

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

View on DB Fiddle

使用 window 函数 MAX() 得到最大值 numFIRST_VALUE() 得到最大值 numbusiness_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;