Как получить дату и сумму между двумя столбцами в оракуле? - PullRequest
0 голосов
/ 02 января 2019

Я застрял в запросе, и таблица равна

TP_DEALNUM  DEALDATE    MATURITYDATE    TP_DEALTYPE     TP_NETVALUE
500         20180521    20180524        NBORR           209221500
501         20180525    20180527        NBORR           249221500
502         20180527    20180527        NBORR           747664500
601         20180530    20180531        CBORR           1000000000
602         20180530    20180531        CBORR           500000000

, и мой запрос таков: если разница дат между dealdate и MATURITYDATE = 2, тогда мне нужно

DEALDATE  TP_NETVALUE
20180525   249221500
20180526   249221500

и если датаразница между dealdate и MATURITYDATE = 3, тогда мне нужно

DEALDATE  TP_NETVALUE
20180521   209221500
20180522   209221500
20180523   209221500

, а разница дат будет увеличиваться до 14

Я пробовал запрос ниже, но я не получаю вывод

WITH cte AS (
    SELECT tp_dealnum,dealdate,  maturitydate,TP_DEALTYPE,TP_NETVALUE, 
    (maturitydate -dealdate) AS DateDiff
    FROM tablename)
    SELECT case WHEN datediff=2 THEN dealdate+1 
            WHEN datediff=3 THEN dealdate+1 END AS dealdate_1,
    tp_netvalue  FROM cte 
    WHERE  DateDiff >= 2

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Ключ генерирует другой CTE с такими прерывистыми датами, как эта-

WITH deal AS
         (SELECT 500 TP_DEALNUM,
                 20180521 DEALDATE,
                 20180524 MATURITYDATE,
                 'NBORR' TP_DEALTYPE,
                 209221500 TP_NETVALUE
            FROM dual
          UNION ALL
          SELECT 501, 20180525, 20180527, 'NBORR', 249221500 FROM dual
          UNION ALL
          SELECT 502, 20180527, 20180527, 'NBORR', 747664500 FROM dual
          UNION ALL
          SELECT 601, 20180530, 20180531, 'CBORR', 1000000000 FROM dual
          UNION ALL
          SELECT 602, 20180530, 20180531, 'CBORR', 500000000 FROM dual),
     daterange AS
         (SELECT min (dealdate) start_date, max (maturitydate) end_date
            FROM deal),
     intermittent_date AS
         (    SELECT start_date + level - 1 AS int_date
                FROM daterange
          CONNECT BY start_date + level - 1 <= end_date)
SELECT id.int_date dealdate, dl.tp_netvalue
  FROM deal dl
       INNER JOIN intermittent_date id
           ON id.int_date BETWEEN dl.dealdate AND dl.maturitydate - 1
 WHERE dl.maturitydate - dl.dealdate = 2;

Выход:

  DEALDATE TP_NETVALUE
---------- -----------
  20180525   249221500
  20180526   249221500
0 голосов
/ 02 января 2019

Я рекомендую использовать подход календарной таблицы здесь.Вести записи всех дат сделок, которые будут покрывать пробелы в вашей текущей таблице, а затем присоединиться к ней:

WITH dates AS (
    SELECT date '2018-05-01' AS DEALDATE FROM dual UNION ALL
    SELECT date '2018-05-02' FROM dual UNION ALL
    SELECT date '2018-05-02' FROM dual UNION ALL
    ....
    SELECT date '2018-05-30' FROM dual UNION ALL
    SELECT date '2018-05-31' FROM dual
)

SELECT
    d.DEALDATE,
    t.TP_NETVALUE
FROM dates d
INNER JOIN tablename t
    ON d.DEALDATE BETWEEN t.DEALDATE AND t.MATURITYDATE - 1
WHERE
    t.MATURITYDATE - t.DEALDATE BETWEEN 2 AND 3;

Обратите внимание, что это просто создает недостающие данные.Если вы хотите включить его в какой-либо другой запрос / логику, вам придется выполнить дополнительную работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...