使用Dremio筛选数据表中每日最后一条Datetime记录的SQL问题
解决Dremio中筛选每日最后一条记录的问题
问题分析
你之前的SQL失败原因很明确:子查询里按完整的Date_and_time字段分组,这会让每条时间戳单独成为一个分组,MAX(Date_and_time)结果就是该条记录自身,关联后自然会返回所有行,完全达不到按天筛选的目的。
方案一:关联子查询法
利用Dremio的DATE_TRUNC('day', 字段名)函数提取日期部分,先按日期分组计算每天的最晚时间,再关联原表匹配对应记录:
SELECT t1.* FROM t1 INNER JOIN ( -- 按天分组,计算每天的最大时间戳 SELECT DATE_TRUNC('day', Date_and_time) AS day_date, MAX(Date_and_time) AS last_time FROM t1 GROUP BY day_date ) t2 ON DATE_TRUNC('day', t1.Date_and_time) = t2.day_date AND t1.Date_and_time = t2.last_time ORDER BY t1.Date_and_time;
方案二:窗口函数法(更简洁)
用ROW_NUMBER()窗口函数,按日期分区、时间戳降序排序,直接取每组的第一条记录:
SELECT Date_and_time, Parameter FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY DATE_TRUNC('day', Date_and_time) ORDER BY Date_and_time DESC ) AS rn FROM t1 ) t WHERE rn = 1 ORDER BY Date_and_time;
关键说明
Dremio中不能直接用DATE(Date_and_time)提取日期(这是你之前报错的原因),需要用DATE_TRUNC('day', Date_and_time)来截断datetime到日期维度,该函数会返回yyyy-MM-dd 00:00:00.000格式的datetime值,用于分组是完全可行的。
内容的提问来源于stack exchange,提问作者Laura Ostrowska
相关产品推荐
相关产品推荐

