如何有条件地 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
我有以下查询:
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