Oracle SQL实现周日期转日日期并避免数据重复
Oracle SQL:将周日期转换为每日日期并避免重复数据
方法1:递归CTE生成日期偏移
通过递归CTE生成0到6的日期偏移量,与原表交叉连接得到一周内的所有日期,并用DISTINCT过滤重复数据:
WITH day_offsets AS ( SELECT 0 AS offset FROM DUAL UNION ALL SELECT offset + 1 FROM day_offsets WHERE offset < 6 ) SELECT DISTINCT t.ID, t.Item, t.Weekdate + do.offset AS Days, t.TotalQty FROM your_table t CROSS JOIN day_offsets do;
方法2:CONNECT BY层级查询
利用Oracle层级查询生成一周7天,通过PRIOR SYS_GUID()防止循环,同时用DISTINCT确保无重复:
SELECT DISTINCT t.ID, t.Item, t.Weekdate + LEVEL - 1 AS Days, t.TotalQty FROM your_table t CONNECT BY LEVEL <= 7 AND PRIOR ID = ID AND PRIOR Item = Item AND PRIOR Weekdate = Weekdate AND PRIOR SYS_GUID() IS NOT NULL;
关键说明
- 日期偏移调整:假设
Weekdate是一周起始日(如周一),若Weekdate为周末(如周日),可修改偏移逻辑为Weekdate - 6 + do.offset覆盖整周。 - 去重优化:如果原表本身无重复的ID/Item/Weekdate记录,可去掉
DISTINCT提升查询性能。 - 纯SQL实现:两种方案均无需PL/SQL,完全通过SQL语句完成需求。
内容的提问来源于stack exchange,提问作者Marius
相关产品推荐
相关产品推荐

