Loops Teradata的While循环

Loops Teradata的While循环,loops,teradata,Loops,Teradata,世界 我正在试图找到一种方法来将多个事件编译在一起。数据如下所示: 基本上,它是一系列带有事件日志的行数据 我希望生成这些行事件的聚合,这样,如果在另一个结束后的30秒内发生新事件,它会将时间合并在一起。但是,如果事件日志没有邻接事件,则不会捕获它。这些事件是“个人”特有的 我设想输出如下所示: 我的直觉建议使用某种while循环,但我不确定从哪里开始使用递归CTE可以实现这一点 将MYTABLE更改为您的tablename您可以使用递归CTE实现这一点 将MYTABLE更改为您的tablena

世界

我正在试图找到一种方法来将多个事件编译在一起。数据如下所示:

基本上,它是一系列带有事件日志的行数据

我希望生成这些行事件的聚合,这样,如果在另一个结束后的30秒内发生新事件,它会将时间合并在一起。但是,如果事件日志没有邻接事件,则不会捕获它。这些事件是“个人”特有的

我设想输出如下所示:


我的直觉建议使用某种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。这和我希望的非常接近。谢谢你,诺思。