SQL时间区间查询起止值相等时的重复数据去除问题

经测试,Chrome浏览器无法正常显示表格,但在Edge浏览器中可正常展示
问题原因
重复数据由两个问题共同导致:
- 你使用
BETWEEN做小时范围匹配属于双侧闭区间逻辑,只要小时数大于等于start_at的小时、小于等于end_at的小时就会被纳入结果。当end_at恰好为整点值时,提取到的小时数会和你生成的time字段(整点时间)完全对齐,把不属于统计范围的边界时段纳入结果。 - 语句中同时写了
SELECT DISTINCT和GROUP BY 1,2,3,4,5属于冗余写法,二者都是全字段去重逻辑,无法修正边界判断错误带来的重复行问题。
修复方案
直接改用时间值比较代替小时数提取判断,采用时段统计通用的左闭右开区间规则(即结束时间恰好等于整点time时不纳入统计),从根源避免边界计算错误,同时删除冗余的DISTINCT即可:
SELECT TIME(hour, 0, 0) AS time, date, start_at, end_at, total FROM a, UNNEST(GENERATE_ARRAY(0, 23)) hour WHERE TIME(hour, 0, 0) >= TIME(start_at) AND TIME(hour, 0, 0) < TIME(end_at) GROUP BY 1,2,3,4,5
如果你的业务规则要求end_at和time相等时也要保留该条数据,只需要把第二个条件的<改成<=即可,不会再出现重复。
内容的提问来源于stack exchange,提问作者BoB
相关产品推荐
相关产品推荐

