Loops Teradata的While循环
世界 我正在试图找到一种方法来将多个事件编译在一起。数据如下所示: 基本上,它是一系列带有事件日志的行数据 我希望生成这些行事件的聚合,这样,如果在另一个结束后的30秒内发生新事件,它会将时间合并在一起。但是,如果事件日志没有邻接事件,则不会捕获它。这些事件是“个人”特有的 我设想输出如下所示:Loops Teradata的While循环,loops,teradata,Loops,Teradata,世界 我正在试图找到一种方法来将多个事件编译在一起。数据如下所示: 基本上,它是一系列带有事件日志的行数据 我希望生成这些行事件的聚合,这样,如果在另一个结束后的30秒内发生新事件,它会将时间合并在一起。但是,如果事件日志没有邻接事件,则不会捕获它。这些事件是“个人”特有的 我设想输出如下所示: 我的直觉建议使用某种while循环,但我不确定从哪里开始使用递归CTE可以实现这一点 将MYTABLE更改为您的tablename您可以使用递归CTE实现这一点 将MYTABLE更改为您的tablena
我的直觉建议使用某种while循环,但我不确定从哪里开始使用递归CTE可以实现这一点
将MYTABLE更改为您的tablename您可以使用递归CTE实现这一点
将MYTABLE更改为您的tablename不需要递归,也不需要非常难写或在光标上循环
SELECT
Person,
Min(starttime),
Max(starttime),
-- get a concatenated string
Trim(Trailing ',' FROM (XmlAgg(Reason || ',' ORDER BY Reason ) (VARCHAR(1000))))
FROM
(
SELECT Person, Start_timestamp, Stop_timestamp, Reason,
-- assign the same number to all rows within 30 seconds
Sum(flag) Over
Over (PARTITION BY Person
ORDER BY Start_timestamp
ROWS Unbounded Preceding) AS grp
FROM
(
SELECT Person, Start_timestamp, Stop_timestamp, Reason,
-- check if previous end is within 30 seconds of the current start
CASE WHEN Lag(Stop_timestamp)
Over (PARTITION BY Person
ORDER BY Start_timestamp) + INTERVAL '30' SECOND < Start_timestamp
THEN 0
ELSE 1
END AS flag
FROM tab
) AS dt
) AS dt
-- aggregate per person and group
GROUP BY Person, grp
如果您的Teradata版本支持sessione,那么您可以简化组计算,但我无法编写这种特殊语法:-不需要递归,也很难编写或在游标上循环
SELECT
Person,
Min(starttime),
Max(starttime),
-- get a concatenated string
Trim(Trailing ',' FROM (XmlAgg(Reason || ',' ORDER BY Reason ) (VARCHAR(1000))))
FROM
(
SELECT Person, Start_timestamp, Stop_timestamp, Reason,
-- assign the same number to all rows within 30 seconds
Sum(flag) Over
Over (PARTITION BY Person
ORDER BY Start_timestamp
ROWS Unbounded Preceding) AS grp
FROM
(
SELECT Person, Start_timestamp, Stop_timestamp, Reason,
-- check if previous end is within 30 seconds of the current start
CASE WHEN Lag(Stop_timestamp)
Over (PARTITION BY Person
ORDER BY Start_timestamp) + INTERVAL '30' SECOND < Start_timestamp
THEN 0
ELSE 1
END AS flag
FROM tab
) AS dt
) AS dt
-- aggregate per person and group
GROUP BY Person, grp
如果您的Teradata版本支持Sessione,您可以简化组计算,但我无法编写此syntaxc即席:-这与我所希望的非常接近。谢谢dnoeth。这和我希望的非常接近。谢谢你,诺思。