使用重叠时间窗计算不同的值

时间:2018-05-07 21:04:20

标签: sql teradata

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

我被要求在每个星期六结束的30天内计算独特用户。所以psuedo代码看起来像:

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

这很好,除了我需要为每个星期六返回一个值,我需要使用交互式SQL,没有编译的UDF,程序或循环来执行此操作。

理想的结果如下:

周末独特用户

4/7/18 10000

4/14/18 15000

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

1 个答案:

答案 0 :(得分:0)

您可以使用Teradata的PERIOD数据类型和Sys_calendar.Calendar表将它们组合在一起:

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表构造了句点,我们就可以INNER JOIN返回到你的表并聚合。