有什么方法可以存储上一次迭代的行结果,并将其用于下一行迭代?
例如,我有一个表say(Time_Table)。
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则:
exceptionTime
对于第一行,因为之前没有任何行09:00:00,,它将直接将此记录放入我的目标表中。现在我的参考点是9:00:00。
09:00:00,
对于10:00:00,最后一个参考点的第二行是09:00:00和TIMESTAMPDIFF(s,09:00:00,10:00:00)是60,它小于所需的90。我没有将此行添加到目标表中。
10:00:00,
09:00:00
TIMESTAMPDIFF(s,09:00:00,10:00:00)
对于第三行,最后一个记录的异常在,09:00:00并且TIMESTAMPDIFF(s,09:00:00,11:00:00)为120,大于所需的90,因此我选择了该记录并将参考点设置为11:00:00。
TIMESTAMPDIFF(s,09:00:00,11:00:00)
11:00:00
对于第四行TIMESTAMPDIFF(s,11:00:00,12:00:00)。同样,它不会被保存。
TIMESTAMPDIFF(s,11:00:00,12:00:00)
再次保存。
目标表
__ 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?
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 )
但这实际上是行不通的。
在Vertica中仅使用纯SQL是不可能的。要在纯SQL中执行此操作,您需要能够执行Vertica产品不支持的递归查询。在其他数据库产品中,可以使用WITH子句执行此操作。对于Vertica,您将必须在应用程序逻辑中执行此操作。这是基于以下语句的:“查询块中的每个WITH子句必须具有唯一的名称。尝试对同一查询块中的WITH子句查询名称使用同名别名会导致错误。WITH子句不支持INSERT,DELETE,和UPDATE语句,并且您不能递归使用它们”,来自Vertica 7.1.x文档