我在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的多个级别的帖子,但我无法得到我需要的东西。有什么想法吗?
答案 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返回到你的表并聚合。