每个id SQL

时间:2018-02-06 18:17:34

标签: sql db2

我有一个查询,它以下列格式生成数据:

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 对数据进行排序。

3 个答案:

答案 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