小编典典

如何在sql中保存要用于下一行的最后一个检查点

sql

有什么方法可以存储上一次迭代的行结果,并将其用于下一行迭代?

例如,我有一个表say(Time_Table)。

__   Key   type   timeStamp             
1 )    1     B    2015-06-28 09:00:00  
2 )    1     B    2015-06-28 10:00:00  
3 )    1     C    2015-06-28 11:00:00  
4 )    1     A    2015-06-28 12:00:00  
5 )    1     B    2015-06-28 13:00:00

现在假设我有exceptionTime90分钟的时间是恒定的。如果我开始检查我的,Time_Table则:

  1. 对于第一行,因为之前没有任何行09:00:00,,它将直接将此记录放入我的目标表中。现在我的参考点是9:00:00。

  2. 对于10:00:00,最后一个参考点的第二行是09:00:00TIMESTAMPDIFF(s,09:00:00,10:00:00)是60,它小于所需的90。我没有将此行添加到目标表中。

  3. 对于第三行,最后一个记录的异常在,09:00:00并且TIMESTAMPDIFF(s,09:00:00,11:00:00)为120,大于所需的90,因此我选择了该记录并将参考点设置为11:00:00

  4. 对于第四行TIMESTAMPDIFF(s,11:00:00,12:00:00)。同样,它不会被保存。

  5. 再次保存。

目标表

__   Key   type   timeStamp             
1 )    1     B    2015-06-28 09:00:00  
2 )    1     C    2015-06-28 11:00:00   
3 )    1     B    2015-06-28 13:00:00

有什么办法可以解决这个问题purely in SQL

我的方法:

SELECT * FROM Time_Table A WHERE NOT EXISTS(
       SELECT 1 FROM Time_Table B
       WHERE  A.timeStamp > B.timeStamp
       AND    abs(TIMESTAMPDIFF(s,B.timeStamp,A.timeStamp)) > 90 
)

但这实际上是行不通的。


阅读 177

收藏
2021-04-22

共1个答案

小编典典

在Vertica中仅使用纯SQL是不可能的。要在纯SQL中执行此操作,您需要能够执行Vertica产品不支持的递归查询。在其他数据库产品中,可以使用WITH子句执行此操作。对于Vertica,您将必须在应用程序逻辑中执行此操作。这是基于以下语句的:“查询块中的每个WITH子句必须具有唯一的名称。尝试对同一查询块中的WITH子句查询名称使用同名别名会导致错误。WITH子句不支持INSERT,DELETE,和UPDATE语句,并且您不能递归使用它们”,来自Vertica
7.1.x文档

2021-04-22