DB2 SQL 查找与其他行间隔 1 分钟的行
DB2 SQL Finding rows with a gap of 1 minute with other rows
DB2 v10.5.0.5 Linux
我有一个 table 类似的东西:
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
我想 select 与其他行间隔 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
在 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
以上将符合您想要的结果以及匹配的其他行的 returns 数据。
根据您的 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
这 可能 比自连接更快(您需要检查):日期数学将导致优化器忽略任何索引,这可能是一个重要的大型表的性能损失。但是,请注意,这会将您限制在 one 前一行,这可能不是您想要的(这需要自连接才能找到所有匹配的行)。
DB2 v10.5.0.5 Linux
我有一个 table 类似的东西:
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
我想 select 与其他行间隔 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
在 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
以上将符合您想要的结果以及匹配的其他行的 returns 数据。
根据您的 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
这 可能 比自连接更快(您需要检查):日期数学将导致优化器忽略任何索引,这可能是一个重要的大型表的性能损失。但是,请注意,这会将您限制在 one 前一行,这可能不是您想要的(这需要自连接才能找到所有匹配的行)。