首页 > 解决方案 > 如何有条件地为每个用户选择一行?

问题描述

我有以下查询:

select count(1) num, business_id, user_id FROM `pos_transactions` 
group by user_id, business_id
order by user_id

它返回这个:

+--------+-------------+---------+
|  num   | business_id | user_id |
+--------+-------------+---------+
| 3      | 503         | 12      |
| 7      | 33          | 12      |
| 1      | 771         | 13      |
| 2      | 86          | 13      |
| 1      | 772         | 13      |
| 4      | 652         | 14      |
| 4      | 567         | 14      |
+--------+-------------+---------+

我只需要选择每一行user_id,即价值更大的那一行num。如果num用户的所有值都相同,则应随机选择其中一个(即 user #14)。所以,这是预期的结果:

+--------+-------------+---------+
|  num   | business_id | user_id |
+--------+-------------+---------+
| 7      | 33          | 12      |
| 2      | 86          | 13      |
| 4      | 567         | 14      |
+--------+-------------+---------+

知道我该怎么做吗?


我想解决方案将与limit 1每个用户有关。但我不知道应该如何编写查询。

我要做的就是使每个表唯一user_id,并且逻辑是选择具有更大的行num

标签: mysqlwindow-functions

解决方案


使用MAX()FIRST_VALUE()窗口功能:

SELECT DISTINCT 
       MAX(COUNT(*)) OVER (PARTITION BY user_id) num, 
       FIRST_VALUE(business_id) OVER (PARTITION BY user_id ORDER BY COUNT(*) DESC) business_id, 
       user_id 
FROM pos_transactions 
GROUP BY user_id, business_id
ORDER BY user_id

推荐阅读