Oracle如何实现同一objectid按小时分组取该时段最后一条记录
实现方案
可通过窗口函数ROW_NUMBER()实现按小时分组去重,核心逻辑是对同一个objectid、同一个小时的所有记录按datetimeutc倒序排序,取排序后第1条的记录即可,改写后的SQL如下:
SELECT * FROM ( SELECT t.*, ROW_NUMBER() OVER ( PARTITION BY objectid, TRUNC(datetimeutc, 'HH24') ORDER BY datetimeutc DESC ) AS rn FROM prod.WX_RAW t WHERE TRUNC(datetimeutc, 'DD') = TO_DATE('01-01-2021', 'DD-MM-YYYY') AND objectid = 10000355399 AND TEMP_CODE NOT IN ('7','2','3','R','U') AND OBS_TYPEID IN ('7', '4', '6') AND REPORTTYPE = 'FM-15' ) WHERE rn = 1 ORDER BY datetimeutc;
关键逻辑说明
PARTITION BY objectid, TRUNC(datetimeutc, 'HH24')按objectid和小时维度分组,同一objectid的同一小时数据会被分到同一个分区ORDER BY datetimeutc DESC将每个分区内的记录按时间从晚到早排序,最晚的那条记录排序值为1- 外层过滤
rn = 1,仅保留每个小时最晚的1条记录
你给出的示例数据中,2021年1月1日23点的三条记录经过上述逻辑处理后,只会保留23:55对应的那条数据,完全匹配需求。
内容的提问来源于stack exchange,提问作者Webb
相关产品推荐
相关产品推荐

