Oracle:按起始日期递增复制行至指定最大日期的实现方法
Oracle 按日期范围扩展数据行解决方案
不用写循环,Oracle里有两种高效的方式可以实现你的需求——针对每个Name、Colour组合,从起始日期开始逐日生成数据行,直到指定的最大日期(31/01/2023)。假设你的原表名为source_table,字段分别是NAME、START_DATE(DATE类型)、COLOUR。
方法一:递归CTE(WITH子句)
递归CTE可以逐行生成日期序列,逻辑清晰易读:
WITH date_expand AS ( -- 锚点成员:取出原表的所有初始行 SELECT NAME, START_DATE AS CURRENT_DATE, COLOUR, DATE '2023-01-31' AS MAX_DATE FROM source_table UNION ALL -- 递归成员:逐日递增日期,直到达到最大日期 SELECT NAME, CURRENT_DATE + 1, COLOUR, MAX_DATE FROM date_expand WHERE CURRENT_DATE < MAX_DATE ) SELECT NAME, CURRENT_DATE, COLOUR FROM date_expand ORDER BY NAME, CURRENT_DATE;
方法二:CONNECT BY层级查询
利用Oracle的层级查询特性,通过LEVEL生成日期增量,适合习惯传统写法的场景:
SELECT DISTINCT st.NAME, st.START_DATE + (LEVEL - 1) AS CURRENT_DATE, st.COLOUR FROM source_table st CONNECT BY LEVEL <= (DATE '2023-01-31' - st.START_DATE + 1) -- 确保每个组合的层级只基于自身数据,避免交叉关联 AND PRIOR st.NAME = st.NAME AND PRIOR st.COLOUR = st.COLOUR AND PRIOR SYS_GUID() IS NOT NULL -- 防止ORA-01436错误 ORDER BY st.NAME, CURRENT_DATE;
期望输出示例
| Name | 当前日期 | Colour |
|---|---|---|
| Dan | 01/01/2023 | Red |
| Dan | 02/01/2023 | Red |
| ... | ... | ... |
| Dan | 31/01/2023 | Red |
| Mike | 12/01/2023 | Blue |
| Mike | 13/01/2023 | Blue |
| ... | ... | ... |
| Mike | 31/01/2023 | Blue |
内容的提问来源于stack exchange,提问作者felix.en
相关产品推荐
相关产品推荐

