如何在现有PL/SQL脚本中新增年度周一日期列
问题描述
我有如下PL/SQL脚本:
WITH date_range (mydate) AS ( SELECT TRUNC (SYSDATE - 7, 'mm') - 1 + LEVEL FROM DUAL CONNECT BY LEVEL <= TRUNC (ADD_MONTHS (SYSDATE - 7, 12), 'mm') - TRUNC (SYSDATE - 7, 'mm')), weeknum_per_date (mydate, nr_of_sundays) AS (SELECT mydate, ( TRUNC (mydate, 'day') - TRUNC (TRUNC (mydate, 'yyyy'), 'day')) / 7 + CASE WHEN TO_CHAR (TRUNC (mydate, 'YYYY'), 'day') = 'sun' THEN 1 ELSE 0 END AS nr_of_sundays FROM date_range) SELECT TO_CHAR (mydate, 'YYYY') AS year, LISTAGG ( DISTINCT TO_CHAR (TRUNC (mydate, 'MONTH'), 'MONTH'), ', ') AS MONTHS, (nr_of_sundays + 1) week_num FROM weeknum_per_date WHERE TO_DATE (mydate, 'DD/MM/YY') >= TO_DATE (SYSDATE - 7, 'DD/MM/YY') GROUP BY (nr_of_sundays + 1), TO_CHAR (mydate, 'YYYY') ORDER BY TO_CHAR (mydate, 'YYYY'), TO_CHAR (nr_of_sundays + 1, 'fm00');
该脚本返回年份、当周所属月份、年度周数。
我希望在不改动原有可运行代码逻辑的前提下,新增一列展示年度内每周的周一日期。
原脚本返回结果示例:
YEAR| MONTHS| WEEK_NUM
2023| APRIL| 15
2023| APRIL| 16
2023| APRIL| 17
2023| APRIL , MAY| 18
2023| MAY| 19
......
(共52周)
期望的返回结果示例:
YEAR| MONTHS| WEEK_NUM| MONDAY_DATE_OF_THE_WEEK
2023| APRIL| 15| 17.04.2023
2023| APRIL| 16| 24.04.2023
2023| APRIL| 17| 01.05.2023
2023| APRIL , MAY| 18| 08.05.2023
2023| MAY| 19| 15.05.2023
......
(共52周)
请问如何实现该需求?
解决方案
经过@Paul W的解答并结合LEAD函数后,以下脚本可返回预期结果(虽可能存在更优方案,但已满足需求):
WITH date_range (mydate) AS ( SELECT TRUNC (SYSDATE - 7, 'mm') - 1 + LEVEL FROM DUAL CONNECT BY LEVEL <= TRUNC (ADD_MONTHS (SYSDATE - 7, 12), 'mm') - TRUNC (SYSDATE - 7, 'mm')), weeknum_per_date (mydate, nr_of_sundays) AS (SELECT mydate, ( TRUNC (mydate, 'day') - TRUNC (TRUNC (mydate, 'yyyy'), 'day')) / 7 + CASE WHEN TO_CHAR (TRUNC (mydate, 'YYYY'), 'day') = 'sun' THEN 1 ELSE 0 END AS nr_of_sundays FROM date_range) SELECT TO_CHAR (mydate, 'YYYY') AS year, LISTAGG ( DISTINCT TO_CHAR (TRUNC (mydate, 'MONTH'), 'MONTH'), ', ') AS MONTHS, (nr_of_sundays + 1) week_num, LEAD (TRUNC(MIN(mydate),'IW'),1,TRUNC(MIN(mydate+7),'IW')) OVER (ORDER BY TRUNC(MIN(mydate),'IW')) AS MONDAY_DATE FROM weeknum_per_date WHERE TO_DATE (mydate, 'DD/MM/YY') >= TO_DATE (SYSDATE - 7, 'DD/MM/YY') GROUP BY (nr_of_sundays + 1), TO_CHAR (mydate, 'YYYY') ORDER BY TO_CHAR (mydate, 'YYYY'), TO_CHAR (nr_of_sundays + 1, 'fm00');
内容的提问来源于stack exchange,提问作者Emre Kayacık
相关产品推荐
相关产品推荐

