如何基于SourceID优先级为每个EventID获取对应CommencingTime
按Source优先级获取每个EventID对应时间的解决方案
错误原因说明
你之前使用MIN OVER PARTITION BY ORDER BY SourceID DESC得到错误结果,是因为该语句的逻辑是按SourceID降序排序后取分组内最小的CommencingTime,你的数据中SourceID=2对应的时间是更早的2021-10-24 10:58:00,自然会被MIN函数选中,和「优先取最高SourceID对应时间」的需求逻辑完全不匹配。
实现方案
方案1:窗口函数ROW_NUMBER实现(兼容性最好,推荐)
核心逻辑:按EventID分组,每组内按SourceID降序排序,取每组排序第一的记录即可。
SELECT EventID, CommencingTime, SourceID FROM ( SELECT EventID, CommencingTime, SourceID, -- 同EventID下SourceID越大优先级越高,排越靠前 ROW_NUMBER() OVER (PARTITION BY EventID ORDER BY SourceID DESC) AS rn FROM 数据表名 ) temp WHERE rn = 1;
如果存在同一个EventID下有多个相同最高优先级SourceID的记录,需要全部返回的话,把ROW_NUMBER()替换为RANK()即可。
方案2:关联子查询实现
核心逻辑:先查询每个EventID对应的最高优先级SourceID,再关联回原表取对应时间。
SELECT t1.EventID, t1.CommencingTime, t1.SourceID FROM 数据表名 t1 INNER JOIN ( -- 先取每个EventID的最大SourceID SELECT EventID, MAX(SourceID) AS max_source_id FROM 数据表名 GROUP BY EventID ) t2 ON t1.EventID = t2.EventID AND t1.SourceID = t2.max_source_id;
验证结果
以上两种方案运行后,得到的结果和你给出的示例正确结果完全一致:
| EventID | CommencingTime | SourceID |
|---|---|---|
| 12345 | 2021-10-24 12:58:55 | 3 |
| 12346 | 2021-10-24 12:58:55 | 3 |
| 12347 | 2021-10-24 12:58:55 | 3 |
内容的提问来源于stack exchange,提问作者thatsweetguy
相关产品推荐
相关产品推荐

