计算具有重叠时间的不同值 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 并聚合。
我在 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 并聚合。