oracle 获取当前周之前的最后4周和去年的相同4周

zbwhf8kr  于 2022-11-03  发布在  Oracle
关注(0)|答案(1)|浏览(131)

我有一个日期、会计周和会计年度列表:

DATE_VALUE  FISCAL_WEEK FISCAL_YEAR_VALUE
14-Dec-20   51          2020
15-Dec-20   51          2020
16-Dec-20   51          2020
17-Dec-20   51          2020
18-Dec-20   51          2020
19-Dec-20   51          2020
20-Dec-20   51          2020
21-Dec-20   52          2020
22-Dec-20   52          2020
23-Dec-20   52          2020
24-Dec-20   52          2020
25-Dec-20   52          2020
26-Dec-20   52          2020
27-Dec-20   52          2020
28-Dec-20   1           2021
29-Dec-20   1           2021
30-Dec-20   1           2021
31-Dec-20   1           2021
1-Jan-21    1           2021
2-Jan-21    1           2021
3-Jan-21    1           2021
4-Jan-21    2           2021
5-Jan-21    2           2021
6-Jan-21    2           2021
7-Jan-21    2           2021
8-Jan-21    2           2021
9-Jan-21    2           2021
10-Jan-21   2           2021
11-Jan-21   3           2021
12-Jan-21   3           2021
13-Jan-21   3           2021
14-Jan-21   3           2021
15-Jan-21   3           2021
16-Jan-21   3           2021
17-Jan-21   3           2021
18-Jan-21   4           2021
19-Jan-21   4           2021
20-Jan-21   4           2021
21-Jan-21   4           2021
22-Jan-21   4           2021
23-Jan-21   4           2021
24-Jan-21   4           2021
20-Dec-21   52          2021
21-Dec-21   52          2021
22-Dec-21   52          2021
23-Dec-21   52          2021
24-Dec-21   52          2021
25-Dec-21   52          2021
26-Dec-21   52          2021
27-Dec-21   53          2021
28-Dec-21   53          2021
29-Dec-21   53          2021
30-Dec-21   53          2021
31-Dec-21   53          2021
1-Jan-22    53          2021
2-Jan-22    53          2021
3-Jan-22    1           2022
4-Jan-22    1           2022
5-Jan-22    1           2022
6-Jan-22    1           2022
7-Jan-22    1           2022
8-Jan-22    1           2022
9-Jan-22    1           2022
10-Jan-22   2           2022
11-Jan-22   2           2022
12-Jan-22   2           2022
13-Jan-22   2           2022
14-Jan-22   2           2022
15-Jan-22   2           2022
16-Jan-22   2           2022
17-Jan-22   3           2022
18-Jan-22   3           2022
19-Jan-22   3           2022
20-Jan-22   3           2022
21-Jan-22   3           2022
22-Jan-22   3           2022
23-Jan-22   3           2022
24-Jan-22   4           2022
25-Jan-22   4           2022
26-Jan-22   4           2022
27-Jan-22   4           2022
28-Jan-22   4           2022
29-Jan-22   4           2022
30-Jan-22   4           2022

我想提取当前周之前的最后4周和前一年的相同4周。请参见example 1。当所有4周都在同一年内时,此操作可以正常工作。但当涉及到一年的开始时,如果有1周或多周在当前年,而其他周在前一年,则无法获得以下所需的输出:

FISCAL_YEAR_VALUE   FISCAL_WEEK
2020                51
2020                52
2021                2
2021                1
2021                52
2021                53
2022                1
2022                2

我的代码如下所示。我使用日期21-JAN-22作为示例:

SELECT 
  FISCAL_YEAR_VALUE,
  FISCAL_WEEK
FROM TABLE_NAME  

WHERE FISCAL_YEAR_VALUE IN (SELECT * 
FROM (WITH T AS (
    SELECT DISTINCT FISCAL_YEAR_VALUE
    FROM TABLE_NAME
    WHERE TRUNC(DATE_VALUE) <= TRUNC(TO_DATE('21-JAN-22'))--TEST DATE
    ORDER BY FISCAL_YEAR_VALUE DESC
    FETCH NEXT 2 ROWS ONLY
               )
SELECT FISCAL_YEAR_VALUE
FROM T ORDER BY FISCAL_YEAR_VALUE
    )   
                                )                            
AND FISCAL_WEEK IN (SELECT *
FROM (WITH T AS (
    SELECT DISTINCT FISCAL_WEEK, FISCAL_YEAR_VALUE
    FROM TABLE_NAME 
    WHERE TRUNC(DATE_VALUE) <= TRUNC(TO_DATE('21-JAN-22'))--TEST DATE
    ORDER BY FISCAL_YEAR_VALUE DESC, FISCAL_WEEK DESC
    OFFSET 1 ROWS
    FETCH NEXT 4 ROWS ONLY
                )
SELECT FISCAL_WEEK
FROM T ORDER BY FISCAL_YEAR_VALUE, FISCAL_WEEK
    )    
                    )
GROUP BY FISCAL_YEAR_VALUE, FISCAL_WEEK
ORDER BY FISCAL_YEAR_VALUE, FISCAL_WEEK

输出的代码为:

FISCAL_YEAR_VALUE   FISCAL_WEEK
2021                2
2021                1
2021                52
2021                53
2022                1
2022                2

正如你所看到的,2020年的最后两个星期没有包括在内。请参见example 2。我如何在代码中也包括这个异常,使其成为动态的?任何帮助都将不胜感激!

4nkexdtk

4nkexdtk1#

要查找今年的值,可以用途:

SELECT DISTINCT fiscal_year_value, fiscal_week
FROM   table_name
WHERE  date_value <  TRUNC(SYSDATE, 'IW')
AND    date_value >= TRUNC(SYSDATE, 'IW') - INTERVAL '28' DAY

要查找上一年的值,您可以查找今年的最大会计周,并从该年中减去1,然后使用该值查找上一个会计年度的date_value的上限,并且,如果可以使用上一年的类似范围,则:

WITH this_year (fiscal_year_value, fiscal_week) AS (
  SELECT fiscal_year_value, fiscal_week
  FROM   table_name
  WHERE  date_value <  TRUNC(SYSDATE, 'IW')
  AND    date_value >= TRUNC(SYSDATE, 'IW') - INTERVAL '28' DAY
),
max_last_year (max_date_value) AS (
  SELECT MAX(date_value) + INTERVAL '1' DAY
  FROM   table_name
  WHERE  (fiscal_year_value, fiscal_week) IN (
           SELECT fiscal_year_value - 1, fiscal_week
           FROM   this_year
           ORDER BY fiscal_year_value DESC, fiscal_week DESC
           FETCH FIRST ROW ONLY
         )
)
SELECT fiscal_year_value, fiscal_week
FROM   this_year
UNION
SELECT t.fiscal_year_value, t.fiscal_week
FROM   table_name t
       INNER JOIN max_last_year m
       ON (   t.date_value <  m.max_date_value
          AND t.date_value >= m.max_date_value - INTERVAL '28' DAY);

其中,对于示例数据:

Create Table table_name(DATE_VALUE DATE, FISCAL_WEEK INT, FISCAL_YEAR_VALUE INT);

INSERT INTO table_name (date_value, fiscal_week, fiscal_year_value)
  SELECT DATE '2019-12-30' + LEVEL - 1, CEIL(LEVEL/7), 2020
  FROM   DUAL
  CONNECT BY LEVEL <= 7 * 52
UNION ALL
  SELECT DATE '2020-12-28' + LEVEL - 1, CEIL(LEVEL/7), 2021
  FROM   DUAL
  CONNECT BY LEVEL <= 7 * 53
UNION ALL
  SELECT DATE '2022-01-03' + LEVEL - 1, CEIL(LEVEL/7), 2022
  FROM   DUAL
  CONNECT BY LEVEL <= 7 * 52;

输出:
| 会计年度值|会计_周|
| - -|- -|
| 小行星2022|三十八|
| 小行星2022|三十九|
| 小行星2022|四十个|
| 小行星2022|四十一|
| 小行星2021|三十八|
| 小行星2021|三十九|
| 小行星2021|四十个|
| 小行星2021|四十一|
如果今天的日期是2022-01-01,将输出:
| 会计年度值|会计_周|
| - -|- -|
| 小行星2021|五十二人|
| 小行星2021|五十三个|
| 小行星2022|一个|
| 小行星2022| 2个|
| 小行星2020|五十一个|
| 小行星2020|五十二人|
| 小行星2021|一个|
| 小行星2021| 2个|
可能有一个更简单的方法,但没有任何知识,你如何计算一个财政年度,这是不是立即可能的。
fiddle

相关问题