Teradata SQL EXPAND + АККУМУЛИРОВАТЬ - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть данные о посадке, подсчет идентификаторов с течением времени.Я расширил данные, но мне также нужно их накапливать.

У меня есть:

ONBOARDING_DATE ONBOARDED ONBOARDED_EXPANDED
12/06/2018                          
13/06/2018                          
14/06/2018            2            2
15/06/2018                         2
17/06/2018                         2
18/06/2018            5            5
19/06/2018                         5
20/06/2018                         5

Мне нужно их накапливать, поскольку на борт загружается больше идентификаторов, но я не могу найти нужноефункция, которая будет сочетаться с расширением.

ONBOARDING_DATE ONBOARDED ONBOARDED_EXPANDED_ACCUMULATED
12/06/2018                        
13/06/2018                        
14/06/2018            2            2
15/06/2018                         2
17/06/2018                         2
18/06/2018            5            7
19/06/2018                         7
20/06/2018                         7

Мой сценарий,

SELECT 

a.ONBOARDING_DATES
, b.ONBOARDED
, SUM(ONBOARDED) OVER ( PARTITION BY 1
                    ORDER BY ONBOARDING_DATE ASC
                    RESET WHEN ONBOARDED<>0 ) AS ONBOARDED_EXPANDED

FROM

        (
        SELECT 

        CAST(CALENDAR_DATE AS DATE) AS ONBOARDING_DATES FROM 
SYS_CALENDAR.CALENDAR

        WHERE ONBOARDING_DATES BETWEEN ADD_MONTHS(CURRENT_DATE, - 9)  AND ADD_MONTHS(CURRENT_DATE, + 9)

        ) a

LEFT JOIN
    (

            SELECT DISTINCT

            COUNT(ID) AS ONBOARDED
            , WAVE_DATE

            FROM ENV0.R_ONBOARDING

            WHERE WAVE_DATE IS NOT NULL

            GROUP BY WAVE_DATE

    ) b

    ON a.ONBOARDING_DATS = b.WAVE_DATE

    ORDER BY a.ONBOARDING_DATE

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Ваш RESET WHEN может быть переписан с использованием LAST_VALUE плюс IGNORE NULLS, что приводит к одному шагу STATS в Explain вместо двух.И если вы хотите рассчитать как ONBOARDED_EXPANDED, так и ONBOARDED_EXPANDED_ACCUMULATED, вы также можете объединить их за один шаг:

SELECT 
   a.ONBOARDING_DATES
   ,b.ONBOARDED
   ,SUM(ONBOARDED) 
    OVER (ORDER BY ONBOARDING_DATE ASC
          ROWS UNBOUNDED PRECEDIND) AS ONBOARDED_EXPANDED
   ,LAST_VALUE(ONBOARDED IGNORE NULLS) 
    OVER (ORDER BY ONBOARDING_DATE ASC
          ROWS UNBOUNDED PRECEDIND) AS ONBOARDED_EXPANDED_ACCUMULATE

То же PARTITION, тот же ORDER объединяет оба вычисления в один шаг.

0 голосов
/ 04 декабря 2018

Вы, похоже, просто хотите накапливать сумму:

select ONBOARDING_DATE, ONBOARDED,
       sum(onboarded) over (order by onboarding_date rows between unbounded preceding and current row) as ONBOARDED_EXPANDED
from t;
...