mysql - 如何有条件地为每个用户选择一行?
问题描述
我有以下查询:
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
。
解决方案
使用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
推荐阅读
- laravel - Laravel Nova:启用/禁用操作日志视图?
- c++ - 由于未声明的标识符,朋友功能将无法工作
- mongodb - 查询更新显示 0 条记录已更新 mongo
- php - Magento 2:按顺序显示子类别标题和产品?
- mule - 在 Mulesoft Dataweave 2.0 中展开数组
- r - 如何合并数据集,然后创建一个包含两条线和一个辅助轴的折线图?
- android - 停止重叠 Android 音频通知
- python - Django shell_plus:如何在 Docker 容器中访问 Jupyter 笔记本
- websphere - 我可以在 ESQL 中进行 CAST 引用吗?
- node.js - 如何修复“同一连接的重复数据库对象”dynamodb 警告