Linux上的DB2 v10.5.0.5
我有一张类似的表:
LOG_IN | LOG_OFF ----------------------------------------- 2017-01-22 08:00:00 | 2017-01-22 09:00:00 2017-01-22 09:01:00 | 2017-01-22 10:00:00 2017-01-22 10:00:00 | 2017-01-22 10:15:00 2017-01-22 10:15:00 | 2017-01-22 10:45:00 2017-01-22 11:00:00 | 2017-01-22 11:29:00 2017-01-22 11:30:00 | 2017-01-22 12:00:00
我想选择与其他行间隔1分钟的行。
期望的结果:
LOG_IN | LOG_OFF ----------------------------------------- 2017-01-22 08:00:00 | 2017-01-22 09:00:00 2017-01-22 09:01:00 | 2017-01-22 10:00:00 2017-01-22 11:00:00 | 2017-01-22 11:29:00 2017-01-22 11:30:00 | 2017-01-22 12:00:00
答案 0 :(得分:0)
在Db2中,您可以使用date / time arithmetics来执行此操作。没有测试,这样的事情应该有效:
select log_in, log_off
from accountlogs
where log_off - log_in = 1 minute
您也可以使用其他值代替1 minute
而不是<
代替=
。
如果要查找与其他行的间隙,则需要自行加入:
select al1.log_in, al1.log_off, al2.log_in, al2.log_off
from accountlogs al1, accountlogs al2
where al1.log_off - al2.log_in < 1 minute
以上内容符合您想要的结果,并返回匹配的其他行的数据。
答案 1 :(得分:0)
鉴于您的LUW版本,LAG
功能也应该可用:
SELECT log_in, log_off
FROM (SELECT log_in, log_off, (LAG(log_off) OVER (ORDER BY log_in)) - 1 MINUTE AS previous
FROM Data) d
WHERE log_in = previous
可能比自联接更快(您需要检查):日期数学将导致优化程序忽略任何索引,这可能会对性能造成重大影响大桌子。但请注意,这会将您限制为一个前一行,这可能与您不同(这需要自联接才能找到所有匹配的行)。