Найти разницу между столбцами

#sql #oracle

#sql #Oracle

Вопрос:

Я пытаюсь найти разницу между каждым столбцом (датой) по дилеру.

Моя таблица содержит дилеров, месяцы и значения для каждого месяца. Я пытаюсь найти разницу между месяцами (предыдущий- следующий). Я пробовал некоторые запросы с задержкой, но я не получаю правильных результатов.

 SELECT A.FCLTY_NO, A.CSR_MN, A.CP1KVINS,
LEAD(A.CP1KVINS, 1, 0) OVER (ORDER BY A.CP1KVINS) AS NEXT_CPIKVIN,
LEAD(A.CP1KVINS, 1, 0) OVER (ORDER BY A.CP1KVINS) - A.CP1KVINS AS 
DIFF_CP1KVIN
FROM USER9.WPO_VIN_VST_CLM_CY17_TO_DATE A,
     DRBA.ADA_DEALER_T                  E
WHERE A.FCLTY_NO = E.DEALER_NO
AND E.CHANNEL_ELIG_CD = 'N'
AND E.APPOINT_DT < '01JAN2018'
AND E.TERM_DT = '31DEC9999'
ORDER BY A.FCLTY_NO, A.CSR_MN

FCLTY_NO    CSR_MN  CP1KVINS    CP1KVINS_DIFF
01016       1/01/2017     1,060     0
01016       2/01/2017     1,000        -60
01016       3/01/2017     1,070         70
01016       4/01/2017     1,070         0
01016       5/01/2017     1,060        -10
01016       6/01/2017     1,070         10
01016       7/01/2017     1,060        -10
01016       8/01/2017     1,050        -10
01016       9/01/2017     1,060         10
01016       10/01/2017    1,040        -20
  

Комментарии:

1. Пожалуйста, отредактируйте свой вопрос и предоставьте данные для каждой таблицы, которые должны привести к показанному вами результату. Спасибо.

Ответ №1:

Лидам может понадобиться PARTITION BY на объекте.
И это ORDER BY должно быть в поле даты.

Кроме того, лучше начать использовать JOIN синтаксис.
Старый синтаксис запятой устарел еще в предыдущем столетии.

 SELECT fac.FCLTY_NO, fac.CSR_MN, fac.CP1KVINS,
LEAD(fac.CP1KVINS, 1, 0) OVER (PARTITION BY fac.FCLTY_NO ORDER BY fac.CSR_MN) AS NEXT_CPIKVIN,
LEAD(fac.CP1KVINS, 1, 0) OVER (PARTITION BY fac.FCLTY_NO ORDER BY fac.CSR_MN) - fac.CP1KVINS AS DIFF_CP1KVIN
FROM USER9.WPO_VIN_VST_CLM_CY17_TO_DATE fac
JOIN DRBA.ADA_DEALER_T dealer 
  ON dealer.DEALER_NO = fac.FCLTY_NO 
WHERE dealer.CHANNEL_ELIG_CD = 'N'
  AND dealer.APPOINT_DT < '01JAN2018'
  AND dealer.TERM_DT = '31DEC9999'
ORDER BY fac.FCLTY_NO, fac.CSR_MN;
  

Результат:

 FCLTY_NO    CSR_MN          CP1KVINS    NEXT_CPIKVIN    DIFF_CP1KVIN
01016       01/01/2017      1060        1000            -60
01016       01/02/2017      1000        1070            70
01016       01/03/2017      1070        1070            0
01016       01/04/2017      1070        1060            -10
01016       01/05/2017      1060        1070            10
01016       01/06/2017      1070        1060            -10
01016       01/07/2017      1060        1050            -10
01016       01/08/2017      1050        1060            10
01016       01/09/2017      1060        1040            -20
01016       01/10/2017      1040        0               -1040
  

Комментарии:

1. @casaler кажется, это помогло, пожалуйста, попробуйте принять ответ тогда.