如何筛选user_id与raisedtime重复且duration更大的数据行
筛选同user_id和raisedtime组内duration最大的行
你的需求是保留每个user_id+raisedtime分组中duration最大的所有行(包括分组内多个行duration相同且均为最大值的情况)。你当前的SQL仅能得到分组后的最大duration值,无法获取对应的cleartime等完整行数据,以下是两种可行的解决方案:
方案1:通过JOIN关联聚合结果
先分组计算每个user_id+raisedtime组合的最大duration,再将原表与该聚合结果关联,筛选出符合条件的完整行:
SELECT a.* FROM alarms a INNER JOIN ( SELECT user_id, raisedtime, MAX(duration) AS max_duration FROM alarms GROUP BY user_id, raisedtime ) m ON a.user_id = m.user_id AND a.raisedtime = m.raisedtime AND a.duration = m.max_duration;
方案2:使用窗口函数(推荐)
利用窗口函数RANK()对每个分组内的行按duration降序排名,然后筛选排名为1的行(所有最大值行都会被保留):
SELECT user_id, raisedtime, cleartime, duration FROM ( SELECT *, RANK() OVER (PARTITION BY user_id, raisedtime ORDER BY duration DESC) AS rnk FROM alarms ) ranked_data WHERE rnk = 1;
针对你的示例数据,两种方案都会返回以下结果:
| user_id | raisedtime | cleartime | duration |
|---|---|---|---|
| 3_dsr | 2022-07-22 | 2022-07-24 | 22 |
| 1_DSR | 2022-07-24 | 2022-07-26 | 21 |
| 1_DSR | 2022-07-24 | 2022-07-26 | 21 |
内容的提问来源于stack exchange,提问作者rizah
相关产品推荐
相关产品推荐

