使用递归查询聚合期间

2024-04-18

我需要将每个组(ID)的顺序事件(具有标识符 NUM)的重叠周期(由 FROM 和 TO 变量定义)与“先行缓冲区”合并,这意味着如果下一个周期在缓冲区内开始,它们应该是合并了。

例如;在以下示例中,第二个事件 (NUM = 2) 在时间 13 开始,该时间位于缓冲区 (10 + 5 = 15) 内。

与我发现的其他类似问题相比,这里棘手的部分是,尽管每个事件的缓冲期都有固定值,但如果它与具有较长缓冲期的事件(仅向后)合并,则可能会发生变化。

例如;事件三也合并到与事件1和事件2相同的周期,因为这些事件的缓冲周期更长。接下来的缓冲区应该是 (25 + 5 = 30),而不是 (25 + 3 = 28),这意味着接下来的事件 4 也应该包含在这些时间段中。

事件 4 的缓冲期也再次更改为 5。但是,因为 40 > 31+5,所以最后一个事件是单独的观察。

CREATE TABLE MY_TABLE(ID INTEGER, NUM INTEGER, FROM INTEGER, TO INTEGER, LOOKAHEAD INTEGER);
INSERT INTO MY_TABLE VALUES (1, 1, 1,  10, 5);
INSERT INTO MY_TABLE VALUES (1, 2, 13, 20, 5);
INSERT INTO MY_TABLE VALUES (1, 3, 21, 25, 3);
INSERT INTO MY_TABLE VALUES (1, 4, 29, 31, 3);
INSERT INTO MY_TABLE VALUES (1, 5, 40, 50, 3);

最终,我需要的结果是具有两个“不连续”周期的两个观察结果;

(ID = 1, FROM = 1,  TO = 31)
(ID = 5, FROM = 40, TO = 50)

当然,我最初认为我可以通过创建一个新变量 LOOKAHEAD2 来创建这个“LOOKHEAD”变量,该变量是 LOOKAHEAD2 的先前值和 LOOKAHEAD 的当前值的最大值,条件为 FROM(此记录)

相反,我尝试使用递归查询,从第一个事件开始(NUM = 1),然后递归地将表与下一个事件连接起来(root.NUM+1 = next.NUM)有条件地(root.TO + root.LOOKAHEAD > next.FROM),并相应地更新 LOOKAHEAD 变量。

但我以前从未使用过递归查询,并且无法让它加入 LOOKAHEAD 值的更新值。

有谁知道如何通过递归查询或其他方式解决这个问题?


您应该使用RESET WHEN分析函数中的窗口修饰符(LAG在 Teradata 16 中,或MAX在早期);不要使用递归查询。

Update:

DROP TABLE MY_TABLE;
CREATE VOLATILE TABLE MY_TABLE 
( id          INTEGER
, num         INTEGER
, from_value  INTEGER
, to_value    INTEGER
, lookahead   INTEGER
) ON COMMIT PRESERVE ROWS;

INSERT INTO MY_TABLE VALUES (1, 1, 1,  10, 5);
INSERT INTO MY_TABLE VALUES (1, 2, 13, 20, 5);
INSERT INTO MY_TABLE VALUES (1, 3, 21, 25, 3);
INSERT INTO MY_TABLE VALUES (1, 4, 29, 31, 3);
INSERT INTO MY_TABLE VALUES (1, 5, 40, 50, 3);

INSERT INTO MY_TABLE VALUES (2, 1, 1, 10, 5);
INSERT INTO MY_TABLE VALUES (2, 2, 20, 30, 15);
INSERT INTO MY_TABLE VALUES (2, 3, 40, 41, 5);
INSERT INTO MY_TABLE VALUES (2, 4, 100, 200, 5);
INSERT INTO MY_TABLE VALUES (2, 5, 300, 400, 3);


SELECT  id, first_from_value, to_value
FROM  ( SELECT  id
              , to_value
              , CASE WHEN overlaps_flag = 1
                  THEN  NULL
                  ELSE  COALESCE 
                        ( MIN (from_value) 
                            OVER (PARTITION BY id
                                  ORDER BY from_value
                                  RESET WHEN MAX (overlaps_flag) 
                                               OVER (PARTITION BY id 
                                                     ROWS BETWEEN 
                                                          1 PRECEDING 
                                                      AND 1 PRECEDING) = 0
                                  ROWS BETWEEN UNBOUNDED PRECEDING 
                                           AND 1 PRECEDING)
                        , from_value )
                END AS first_from_value
        FROM  ( SELECT  id, from_value, to_value
                      , MAX (from_value) 
                          OVER (PARTITION BY id 
                                ORDER BY from_value 
                                ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING)
                          AS next_from_value
                      , CASE WHEN to_value + lookahead + 1 >= next_from_value
                          THEN 1 ELSE 0 
                        END AS overlaps_flag
                FROM  my_table
              ) AS a
      ) AS a
WHERE first_from_value IS NOT NULL
ORDER BY 1, 2
id  first_from_value    to_value
1   1                   31
1   40                  50
2   1                   10
2   20                  41
2   100                 200
2   300                 400
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用递归查询聚合期间 的相关文章

  • 预估db2、oracle、teradata数据库sql执行代价和时间方法

    DB2 只能得到cost 1 执行存贮过程建表 CALL SYSPROC SYSINSTALLOBJECTS EXPLAIN C CAST NULL AS VARCHAR 128 数据库用户名 2 执行 EXPLAIN PLAN SET Q
  • Oracle 如何列出两个日期之间的月份的最后几天

    我设法获取两个日期之间的所有天数 但我想获取两个日期之间几个月的所有最后一天 使用一个请求 2 个日期之间的所有日期 select to date 01 01 2000 dd mm yyyy LEVEL 1 as jour from dua
  • Postgres 中的递归 CTE

    我有一个结构如下的表 Employee ID Employee Name Manager ID 而且 对于每个员工 我都需要出示最高管理者的 ID 我的意思是 例如 如果我有 EmployeeID 2 其经理为 3 因此 数字 3 的经理为
  • Teradata:如何在存储过程中引发错误

    有没有办法在 Teradata 存储过程内部引发错误 例如 我想检查表是否为空 如果表为空 我希望导致存储过程出错 并显示错误消息 表为空 这将使我能够将错误传递给调用应用程序 TD13 实施标准 SQL 的 SIGNAL RESIGNAL
  • 使用 Python 连接到 Teradata

    我正在尝试连接到 teradata 服务器并使用 python 将数据帧加载到表中 这是我的代码 import sqlalchemy engine sqlalchemy create engine teradata username pas
  • 递归 CTE - 获取后代(多对多关系)

    我拥有的 给定一棵树 或更类似于有向图 描述系统如何由其通用部分组成 现在让这个系统例如人体及其身体部位的节点 例如3可能是有左叶和右叶的肝脏 6 and 9 两者都有静脉 8 也可以在肝脏的任何未指定的位置找到 因此8 gt 3 而且也在
  • PostgreSQL 中是否有相当于 connect by 的功能来按树向上?

    我正在学习如何在 postgresql12 中使用树并发现了一个很好的函数 connectby 例如 SELECT FROM connectby descriptor value descriptor value id parent val
  • 原生 PHP 中具有基本授权的 Soap 标头

    我需要连接到 TeraData SOAP API 该 API 现在需要与登录凭据一起发送授权基本标头 我不知道如何解决这个问题 添加基本 授权标头时 我在 SoapUI 中获得了工作权限 请任何人帮助我直接获取代码 这是 SoapUI 发送
  • 在 Python/Pyodbc 中查询 Teradata 时出现问题

    我正在尝试使用 PyODBC 在 Python 中查询 Teradata 数据库 与数据库的连接已建立正常 但是 当我尝试获取结果时 遇到了此错误 十进制文字无效 u 请帮助 我使用的是 RHEL6 Python 2 7 3 这是代码和结果
  • 尝试获取准确的信息(CTE - 递归)

    我有不同的桌子和goal是获取每个客户的批准工作流程 以这种方式显示该信息 gt 客户 批准者1 批准者2 批准者3 批准者4 首先 我有一个名为实体的表 12 Math Andrew 308 CHAIN1 MathAndrew 13 Jo
  • MySQL - 从值以逗号分隔的列中选择不同的值

    要从 table1 和 column1 获取不同值的列表就像这样做一样简单 SELECT distinct column1 FROM table1 但是 我继承了 不幸的是 一个数据库 其中 column1 包含用逗号分隔的值 column
  • 保留值直到 Teradata 中的值发生变化

    Teradata中有一个交易历史表 其中余额仅在有交易时才会更改 数据如下 Cust id Balance Txn dt 123 1000 27MAY2018 123 350 31MAY2018 例如 对于 5 月 27 日的客户 123
  • ODBC Teradata 驱动程序 HY001 内存分配错误。什么意思?

    我正在使用 python 脚本 该脚本使用 teradata python 模块和类似于下面的脚本将一批数据插入 Teradata 它使用 ODBC 连接 偶尔会出现以下错误 HY001 Teradata ODBC Teradata Dri
  • PostgreSQL递归选择从叶子中查找根元素

    我正在为论坛开发一个数据库 其中包含线程和消息 线程以一条没有消息的消息开始parent id 回复是消息parent id 我有一张消息表 每个项目都引用同一个表上的项目 将它们作为父子关系 create table messages i
  • Teradata 优化器 SQL 中的 Equal 与 Like

    我目前正在尝试优化一些 bobj 报告 其中我们的后端是 Teradata 这Teradata优化器看起来很挑剔 我想知道是否有人想出了一个解决方案或解决方法让优化器以类似的方式对待喜欢的人 My issue is that we allo
  • Oracle SQL 中的有向图使用递归查询仅访问每个节点一次

    描述 在我们的问题域中 我们正在研究一组连接在一起形成图的边 从给定的节点 或多个节点 开始 我们必须列出整个图中连接到给定节点 或多个节点 的所有链接 我们必须从左到右 从上到下显示这些链接 对于循环数量有限的图 我们有一个针对此问题的有
  • 从 Teradata 12 升级到 Teradata 13 后出错....terasso.dll

    我们目前正在将 Teradata 客户端从 v12 升级到 v13 为此 从系统中卸载了旧版 Teradata 12 并安装了 TTU13 安装后 当我尝试使用新的 Teradata 驱动程序添加 ODBC 连接时 出现以下错误 teras
  • MySQL/Postgres查询5分钟间隔数据

    我需要查询方面的帮助 假设这是表中的数据 timestamp 2010 11 16 10 30 00 2010 11 16 10 37 00 2010 11 16 10 40 00 2010 11 16 10 45 00 2010 11 1
  • Teradata Volatile Table 语句未创建任何行

    我想在 Teradata 中创建表 因此我使用这个语法 CREATE VOLATILE TABLE a AS Select FROM WITH DATA PRIMARY INDEX ACCOUNT ID 内部 SELECT 语句生成 4 行
  • 使用 Proc sql 和 Teradata 在 SAS 中编写高效查询

    编辑 这是一组更完整的代码 它准确地显示了下面的答案所发生的情况 libname output data files jeff let DateStart 01Jan2013 d let DateEnd 01Jun2013 d proc s

随机推荐