【发布时间】:2019-05-07 00:09:46
【问题描述】:
我有按日期登录的用户。我的要求是跟踪过去 90 天窗口内登录的用户数。
我对一般的 SQL 和 Teradata 都是新手,我无法让窗口功能按我的需要工作。
我需要以下结果,其中 ACTIVE 是 DATE 前 90 天窗口中出现的唯一 USER_ID 的计数。
DATES ACTIVE_IN_WINDOW
12/06/2018 20
13/06/2018 45
14/06/2018 65
15/06/2018 73
17/06/2018 24
18/06/2018 87
19/06/2018 34
20/06/2018 51
目前我的脚本如下。
就是这里的这条线我搞错了
COUNT ( USER_ID) OVER (PARTITION BY USER_ID ORDER BY EVT_DT ROWS BETWEEN 90 PRECEDING AND 0 FOLLOWING)
我怀疑我需要一组不同的函数来完成这项工作。
SELECT b.DATES , a.ACTIVE_IN_WINDOW
FROM
(
SELECT
CAST(CALENDAR_DATE AS DATE) AS DATES FROM SYS_CALENDAR.CALENDAR
WHERE DATES BETWEEN ADD_MONTHS(CURRENT_DATE, - 10) AND CURRENT_DATE
) b
LEFT JOIN
(
SELECT USER_ID , EVT_DT
, COUNT ( USER_ID) OVER (PARTITION BY USER_ID ORDER BY EVT_DT ROWS BETWEEN 90 PRECEDING AND 0 FOLLOWING) AS ACTIVE_IN_WINDOW
FROM ENV0.R_ONBOARDING
) a
ON a.EVT_DT = b.DATES
ORDER BY b.DATES
感谢您的帮助。
【问题讨论】:
-
ORDER BY EVT_DT ROWS BETWEEN 90 PRECEDING AND 0 FOLLOWING)是逻辑失败的部分 - 除非有人每天登录,否则您跳过的行数与他们登录的天数之间没有关联。如果他们每 3 天只登录一次,则跳过最后 90 行可能会看到您计算 270 天前的登录日期。在其他一些 DBMS 中,这可以通过OVER(order by event_dt RANGE BETWEEN SYSDATE-90 AND SYSDATE)或类似的方法来克服。 Teradata 没有这个
标签: sql teradata teradata-sql-assistant