如何有条件地 select 每个用户一行?

How to select one row per user conditionally?

我有以下查询:

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

它returns这个:

+--------+-------------+---------+
|  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      |
+--------+-------------+---------+

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

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

知道我该怎么做吗?


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

我想做的就是让 table 每个 user_id 唯一,逻辑是 selecting 具有更大 num 的行.

使用MAX()FIRST_VALUE()window函数:

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