SQL查询:指定时间范围内最新记录Delete indicator为1的全列数据
获取指定时间范围内最新删除标记为1的全量记录
可行SQL方案
使用窗口函数ROW_NUMBER()标记每个Code的最新记录,再筛选符合条件的数据,完整语句如下:
WITH ranked_records AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY Code ORDER BY Time DESC) AS rn FROM your_table_name WHERE Time BETWEEN '2023-07-25 00:00:00' AND '2023-07-30 23:59:59' ) SELECT Code, Time, `Delete indicator` FROM ranked_records WHERE rn = 1 AND `Delete indicator` = 1;
方案说明
- 窗口函数标记最新记录:通过
PARTITION BY Code按代码分组,ORDER BY Time DESC让每组内最新的记录排第一,ROW_NUMBER()给每条记录分配序号rn,最新记录的rn为1。 - 时间范围前置过滤:先在CTE里过滤出指定时间范围内的记录,避免对全表计算窗口函数,提升查询效率。
- 最终精准筛选:只保留每组的最新记录(
rn=1),且Delete indicator为1的行,同时返回全列原始数据。
结果验证
- A1:最新记录在时间范围内,
Delete indicator=1,会被选中; - A2:最新记录
Delete indicator=0,被排除; - A3:最新记录
Delete indicator=0,旧记录不在时间范围,不会被选中;
完全符合预期输出。
为什么不用GROUP BY
GROUP BY只能返回分组字段或聚合函数计算的结果,无法直接返回全列的原始数据,而窗口函数可以在保留全列的前提下,对分组内的记录进行排序和标记,完美解决这个问题。
内容的提问来源于stack exchange,提问作者RawC
相关产品推荐
相关产品推荐

