Oracle 重叠日期甲骨文

Oracle 重叠日期甲骨文,oracle,oracle11g,oracle10g,Oracle,Oracle11g,Oracle10g,我有一组日期范围,其中的配置值可以是“S”或“D”,但下面的日期范围可以有重叠的日期,我正在尝试获取相应日期的配置值 注意:如果配置值为“D”,则日期范围将在包含配置值“S”(如果存在)的另一行的数据范围内 数据: 我想要一个像这样的输出 Start_DATE End_Date Config 01-Jan-2020 14-Jan-2020 S 15-Jan-2020 20-Jan-2020 D 16-Jan-2020 31-Jan-20

我有一组日期范围,其中的配置值可以是“S”或“D”,但下面的日期范围可以有重叠的日期,我正在尝试获取相应日期的配置值

注意:如果配置值为“D”,则日期范围将在包含配置值“S”(如果存在)的另一行的数据范围内

数据:

我想要一个像这样的输出

Start_DATE       End_Date    Config
01-Jan-2020      14-Jan-2020    S
15-Jan-2020      20-Jan-2020    D
16-Jan-2020      31-Jan-2020    S
15-Feb-2020      20-Feb-2020    D
01-Mar-2020      20-Mar-2020    S
我尝试了很多方法,但没有一种方法能完全正确地为我实现这一点

逻辑:

  • 给定日期上可能存在重叠的配置值“S”或“D” 射程
  • 查询应提取日期范围为“S”或“S”的位置 “D”

  • 我只为这一个案例写下一个解决方案。正如保护者已经告诉你们的,你们应该提供其他案例,如果有的话,并向我们展示你们以前尝试过的。最有可能的情况是,当hell出现时,它会变成一个
    案例,但我希望下面的解决方案能给您一些启示


    我只为这一种情况写下一个解决方案。正如保护者已经告诉你们的,你们应该提供其他案例,如果有的话,并向我们展示你们以前尝试过的。最有可能的情况是,当
    hell出现时,它会变成一个
    案例,但我希望下面的解决方案能给您一些启示


    请发布您尝试过的几件事情(社区理解它不起作用),并显示实际结果,然后告诉我们结果错误的原因。请发布您尝试过的几件事情(社区理解它不起作用),并显示实际结果,然后告诉我们结果错误的原因。
    Start_DATE       End_Date    Config
    01-Jan-2020      14-Jan-2020    S
    15-Jan-2020      20-Jan-2020    D
    16-Jan-2020      31-Jan-2020    S
    15-Feb-2020      20-Feb-2020    D
    01-Mar-2020      20-Mar-2020    S
    
    WITH MAIN
         AS (SELECT TO_DATE ('01012020', 'DDMMYYYY') AS Start_DATE,
                    TO_DATE ('31012020', 'DDMMYYYY') AS End_Date,
                    'S' AS config
               FROM DUAL
             UNION ALL
             SELECT TO_DATE ('15012020', 'DDMMYYYY') AS Start_DATE,
                    TO_DATE ('20012020', 'DDMMYYYY') AS End_Date,
                    'D' AS config
               FROM DUAL
             UNION ALL
             SELECT TO_DATE ('15022020', 'DDMMYYYY') AS Start_DATE,
                    TO_DATE ('20022020', 'DDMMYYYY') AS End_Date,
                    'D' AS config
               FROM DUAL
             UNION ALL
             SELECT TO_DATE ('01032020', 'DDMMYYYY') AS Start_DATE,
                    TO_DATE ('20032020', 'DDMMYYYY') AS End_Date,
                    'S' AS config
               FROM DUAL
            ),
         MAIN2
         AS (SELECT START_DATE AS DET FROM MAIN
             UNION
             SELECT END_DATE FROM MAIN),
         MAIN3
         AS (SELECT DET AS START_DATE,
                    LEAD (DET, 1)
                       OVER (PARTITION BY TO_CHAR (DET, 'YYYYMM') ORDER BY DET)
                       AS END_DATE,
                      LEAD (DET, 1)
                         OVER (PARTITION BY TO_CHAR (DET, 'YYYYMM') ORDER BY DET)
                    - 1
                       ED2,
                      LEAD (DET, 1)
                         OVER (PARTITION BY TO_CHAR (DET, 'YYYYMM') ORDER BY DET)
                    + 1
                       ED3
               FROM MAIN2),
         MAIN4
         AS (SELECT *
               FROM MAIN3
              WHERE END_DATE IS NOT NULL),
         MAIN5
         AS (SELECT CASE
                       WHEN B.START_DATE IS NOT NULL
                       THEN
                          B.START_DATE
                       WHEN     B.START_DATE IS NULL
                            AND LAG (
                                   A.START_DATE,
                                   1)
                                OVER (
                                   PARTITION BY TO_CHAR (A.START_DATE, 'YYYYMM')
                                   ORDER BY A.START_DATE)
                                   IS NOT NULL
                       THEN
                            LAG (
                               A.START_DATE,
                               1)
                            OVER (PARTITION BY TO_CHAR (A.START_DATE, 'YYYYMM')
                                  ORDER BY A.START_DATE)
                          + 1
                       WHEN     B.START_DATE IS NULL
                            AND LAG (
                                   A.START_DATE,
                                   1)
                                OVER (
                                   PARTITION BY TO_CHAR (A.START_DATE, 'YYYYMM')
                                   ORDER BY A.START_DATE)
                                   IS NULL
                       THEN
                          A.START_DATE
                    END
                       START_DATE,
                    CASE
                       WHEN B.END_DATE IS NOT NULL
                       THEN
                          B.END_DATE
                       WHEN     B.END_DATE IS NULL
                            AND LEAD (
                                   A.END_DATE,
                                   1)
                                OVER (PARTITION BY TO_CHAR (A.END_DATE, 'YYYYMM')
                                      ORDER BY A.START_DATE)
                                   IS NOT NULL
                       THEN
                          A.END_DATE - 1
                       WHEN     B.END_DATE IS NULL
                            AND LEAD (
                                   A.END_DATE,
                                   1)
                                OVER (PARTITION BY TO_CHAR (A.END_DATE, 'YYYYMM')
                                      ORDER BY A.START_DATE)
                                   IS NULL
                       THEN
                          A.END_DATE
                    END
                       END_DATE,
                    B.START_DATE ST,
                    B.END_DATE ED,
                    CASE WHEN B.CONFIG IS NOT NULL THEN B.CONFIG ELSE 'S' END
                       CONFIG
               FROM MAIN4 A
                    LEFT JOIN MAIN B
                       ON B.START_DATE = A.START_DATE AND B.END_DATE = A.END_DATE --AND B.CONFIG='D'
                                                                                 )
      SELECT START_DATE, END_DATE, CONFIG
        FROM MAIN5
    ORDER BY 1