我有一个查询,它以下列格式生成数据:
ID | DATE | STATUS
---+----------------------------+----------
93 | 2018-02-01 14:23:31.90123 | DRAFT
94 | 2018-02-01 14:23:32.44114 | DRAFT
94 | 2018-02-01 16:06:57.971881 | SUBMITTED
94 | 2018-02-01 16:07:25.940212 | REROUTE
94 | 2018-02-01 16:07:25.940212 | SUBMITTED
95 | 2018-02-01 14:24:51.749198 | DRAFT
我正在尝试构建另一个查询,该查询将获取此数据并计算每个日期之间的差异。最终目标是确定每个 ID 在特定状态中停留的时间。有没有人对如何做这个有任何想法?初始查询已按 ID 和 DATE 对数据进行排序。
答案 0 :(得分:1)
使用lag()
:
select t.*, lag(datetime) over (partition by id order by datetime) as prev_datetime
from t;
答案 1 :(得分:0)
@JOSHUA;这是查询和我使用ORACLE测试。希望能帮助到你。谢谢!
select ID,
DATETIME,
STATUS,
ROUND(24*60*60*(DATETIME - LAG(DATETIME) OVER (PARTITION BY ID ORDER BY DATETIME)),2) AS TIME_DIFF_SEC
FROM TABLE
结果:
ID DATETIME STATUS TIME_DIFF_SEC
93 2018-02-01T14:23:31Z DRAFT (null)
94 2018-02-01T14:23:32Z DRAFT (null)
94 2018-02-01T16:06:57Z SUBMITTED 6205
94 2018-02-01T16:07:25Z REROUTE 28
94 2018-02-01T16:07:25Z SUBMITTED 0
95 2018-02-01T14:24:51Z DRAFT (null)
答案 2 :(得分:0)
如果您的系统没有滞后选项
,则为其他方法select f1.*, f2.*
from yourtable f1
left outer join lateral
(
select * from yourtable f0
where f0.id=f1.id and rrn(f1)<>rrn(f0)
order by f0.DATE desc
fetch first rows only
) f2 on 1=1