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

前端之家收集整理的这篇文章主要介绍了如何保存最后一个检查点在sql中用于下一行前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有什么办法可以存储最后一个迭代的行结果,并将其用于下一行迭代?

例如我有一个表(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

现在假设我有一个常数为90分钟的异常时间.
如果我开始检查我的Time_Table,那么:

>对于第一行,因为在09:00:00之前没有行,它会直接把这个记录放在我的目标表中.现在我的参考点是在9:00:00.
>对于第二行在10:00:00,最后一个参考点为09:00:00,TIMESTAMPDIFF(s,09:00:00,10:00:00)为60,小于要求的90.不要将此行添加到我的目标表.
>对于第三行,最后一个记录的例外是在09:00:00,11:00:00)是120,这大于所需的90,所以我选择这个记录设置参考点为11: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

有没有什么办法可以解决这个问题纯粹在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子句不支持INSERT,DELETE,和UPDATE语句,并且您不能递归地使用它们“从 Vertica 7.1.x documentation

猜你在找的MsSQL相关文章