我有一个oracle数据库,机器人正在处理索赔。我有机器人ID,声明ID和进程时间戳。我需要计算机器人从一个声明到下一个声明的时间。然后,我需要显示声明之间超过5分钟的机器人,以及开始声明的声明ID。举个例子:
Bot ID Claim ID Process Timestamp
123 12345 2/19/2018 12:45:26
123 12346 2/19/2018 12:55:11
机器人花了超过5分钟处理索赔12345所以我需要显示:
Bot ID Claim ID Minutes
123 12345 9:85
答案 0 :(得分:2)
您可以使用lag()
的分析形式查看机器人ID的上一行,您可以在其中将window子句中的“previous”定义为基于时间戳。所以:
select bot_id, claim_id,
process_timestamp - lag(process_timestamp)
over (partition by bot_id order by process_timestamp) as elapsed
from your_table;
BOT_ID CLAIM_ID ELAPSED
---------- ---------- --------------------
123 12345
123 12346 +00 00:09:45.000000
从另一个时间戳中减去一个时间戳会给你一个间隔,你不能直接格式化,但你可以提取它的元素并将它们作为一个字符串粘在一起:
select bot_id, claim_id,
extract(minute from elapsed) || ':' || extract(second from elapsed) as minutes
from (
select bot_id, claim_id,
process_timestamp - lag(process_timestamp)
over (partition by bot_id order by process_timestamp) as elapsed
from your_table
)
where elapsed > interval '5' minute;
BOT_ID CLAIM_ID MINUTES
---------- ---------- ----------
123 12346 9:45
或者如果索赔可能超过一小时:
select bot_id, claim_id,
(60 * extract(hour from elapsed)) + extract(minute from elapsed)
|| ':' || extract(second from elapsed) as minutes
from (
...
如果列实际上是日期而不是时间戳,则减法给出数字而不是间隔。将其转换为字符串只需将一天中的一小部分添加到午夜的名义日期即可:
select bot_id, claim_id, to_char(date '1900-01-01' + elapsed, 'MI:SS') as minutes
from (
select bot_id, claim_id,
process_timestamp - lag(process_timestamp)
over (partition by bot_id order by process_timestamp) as elapsed
from your_table
)
where elapsed > 5/1440;
BOT_ID CLAIM_ID MINUTES
---------- ---------- ----------
123 12346 09:45
如果可能超过一小时,则可以制作格式模型HH24:MI:SS
。 (从多个小时算起的分钟数,比如120分钟,稍微复杂一些。)
过滤器现在是5/1440 - 一天有1440分钟,因此代表五分钟。