计算具有重叠时间的不同值 windows

Counting distinct values with overlapping time windows

我在 Teradata 15 中工作,我的数据如下所示: table1 (userid, activitydate, activitytype)

我被要求计算每个星期六结束的 30 天内的唯一用户数。所以伪代码看起来像:

select count(distinct(userid)
from table1 
where activitydate between Saturday and Saturday - 30

这一切都很好,除了我需要 return 每个星期六的一个值,我需要使用交互式 SQL 来做到这一点,没有编译的 UDF、过程或循环。

理想的结果如下:

周末唯一用户数

4/7/18 10000

4/14/18 15000

我已经阅读了很多关于行号和多级 CTE 的帖子,但我无法设法获得我需要的东西。有什么想法吗?

您可以使用 Teradata 的 PERIOD 数据类型和 Sys_calendar.Calendar table 将其放在一起:

WITH saturdays AS (
    SELECT PERIOD(calendar_date - INTERVAL '30' DAY, NEXT(calendar_date)) AS sat_period
    FROM Sys_Calendar."CALENDAR" 
    WHERE calendar_date BETWEEN DATE '2018-01-01' AND CURRENT_DATE
        AND day_of_week = 7
)
SELECT COUNT(DISTINCT userid) count_of_users, 
    END(sat_period) AS saturday_Date
FROM yourtable
    INNER JOIN saturdays ON 
        saturdays.sat_period CONTAINS yourtable.datefield
GROUP BY saturday_date

运行 只是 CTE 本身,您会看到那里发生了什么。我们基本上只是从 sys_calendar 构建当前年份的日期 PERIOD(根据需要更改该日期范围)。 teradata 中的 PERIOD 是截止日期,但不包括范围内的结束日期,因此我们使用 NEXT() 函数将其增加一天。

从 sys_calendar table 构造句点后,我们可以将其内部连接回您的 table 并聚合。