我在Teradata15中工作,我的数据如下所示: 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的行号和多个级别的文章,但是我无法得到我所需要的。有什么想法吗?
发布于 2018-05-07 21:12:49
您可以使用Teradata的句点数据类型和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构建一个日期周期(根据您认为合适的情况更改该日期范围)。teradata中的句点可以达到,但不包括范围内的结束日期,因此我们使用NEXT()函数将其增加了一天。
一旦从sys_calendar表构建了句点,我们就可以将其内部连接回表并进行聚合。
https://stackoverflow.com/questions/50222407
复制相似问题