基于Overwrite字段过滤数据库重复Date/Time记录的实现咨询
数据库记录过滤需求与实现
过滤规则
- 当同一
Date和Time组合下存在Overwrite = true的记录时,仅保留该Overwrite = true的记录,移除所有同组合下Overwrite = false的记录 - 无重复
Date/Time组合的记录(即该组合下仅单条记录,无论Overwrite值),直接保留
原始数据库记录
Date Time Name Overwrite ======= ==== =========== ====== 10/01/2022 04:00 John White false 11/01/2022 20:00 John Lee false 10/01/2022 04:00 Tom Lee true 12/01/2022 04:00 John Lee false
期望过滤结果
Date Time Name Overwrite ======= ====== =========== ========== 10/01/2022 04:00 Tom Lee true 11/01/2022 20:00 John Lee false 12/01/2022 04:00 John Lee false
实现SQL查询
通用方案(适配多数关系型数据库)
通过窗口函数分组筛选,按Date和Time分组后优先保留Overwrite = true的记录:
WITH ranked_records AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY Date, Time ORDER BY CASE WHEN Overwrite = true THEN 0 ELSE 1 END ) AS rn FROM your_table_name ) SELECT Date, Time, Name, Overwrite FROM ranked_records WHERE rn = 1;
逻辑说明
- 窗口函数
ROW_NUMBER()按Date和Time分组,对组内记录排序:Overwrite = true的记录会被标记为第1位(通过CASE语句给它赋值0,优先级高于false对应的1) - 最后筛选每组的第一条记录,即可满足规则要求的过滤逻辑
内容的提问来源于stack exchange,提问作者Working Guy
相关产品推荐
相关产品推荐

