Teradata SQL 扩展 + 累积
Teradata SQL EXPAND + ACCUMULATE
我有入职数据,随着时间的推移计算 ID。我扩充了资料,但还需要积累
我有:
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
随着越来越多的 ID 被加入,我需要它来积累,但无法找到可以与 expand 结合的正确功能。
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
感谢您的帮助。
你似乎只想要一个累计和:
select ONBOARDING_DATE, ONBOARDED,
sum(onboarded) over (order by onboarding_date rows between unbounded preceding and current row) as ONBOARDED_EXPANDED
from t;
您的 RESET WHEN
可以使用 LAST_VALUE
加 IGNORE NULLS
重写,这会在 Explain 中产生一个 STATS 步,而不是两个。如果您想同时计算 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 将两个计算合并为一个步骤。
我有入职数据,随着时间的推移计算 ID。我扩充了资料,但还需要积累
我有:
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
随着越来越多的 ID 被加入,我需要它来积累,但无法找到可以与 expand 结合的正确功能。
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
感谢您的帮助。
你似乎只想要一个累计和:
select ONBOARDING_DATE, ONBOARDED,
sum(onboarded) over (order by onboarding_date rows between unbounded preceding and current row) as ONBOARDED_EXPANDED
from t;
您的 RESET WHEN
可以使用 LAST_VALUE
加 IGNORE NULLS
重写,这会在 Explain 中产生一个 STATS 步,而不是两个。如果您想同时计算 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 将两个计算合并为一个步骤。