如何获取每个ID的行之间的时间差和SQL中状态的变化

问题描述 投票:0回答:1

我正在尝试使用以下数据获取每个 id 和状态更改的时间差:

create table Table1(idversion text, id text, status text,  dt datetime);

insert into Table1 values 
("1_1", "1", "OK",'2020-05-14T01:00:00')
,("1_2", "1", "OK",'2020-05-14T01:00:10')
,("1_3", "1", "NOT OK",'2020-05-14T01:00:20')
,("2_1", "2", "OK",'2020-05-14T01:00:00')
,("2_2", "2", "NOT OK", '2020-05-14T01:00:10')
,("1_4", "1", "OK",'2020-05-14T01:00:30')
,("1_5", "1", "OK",'2020-05-14T01:00:40')
,("1_6", "1", "OK",'2020-05-14T01:00:50')
;
Select * FROM Table1 ORDER BY idversion;
id版本 id 状态 dt
1_1 1 好的 2020-05-14 01:00:00
1_2 1 好的 2020-05-14 01:00:10
1_3 1 不行 2020-05-14 01:00:20
1_4 1 好的 2020-05-14 01:00:30
1_5 1 好的 2020-05-14 01:00:40
1_6 1 好的 2020-05-14 01:00:50
2_1 2 好的 2020-05-14 01:00:00
2_2 2 不行 2020-05-14 01:00:10

我可以这样得到每个id之间的time_diff

SELECT *,
  dt - LAG(dt) OVER ( partition by id order by idversion )as lag
FROM Table1
ORDER BY idversion;

但是我想要做的是获取同一 ID 的所有时间差以及状态发生变化的时间。

所以预期的输出是

id版本 id 状态 时间_差异
“1_1” “1” “好的” 20
“1_3” “1” “不行” 10
“2_1” “2” “好的” 10
sql apache-spark apache-spark-sql
1个回答
0
投票

首先修复表格,因为我确实有这些字段,我只是省略了它们

create table Table1(idversion text, id text, version int, status text,  dt datetime);
insert into Table1 values 
("1_1", "1", 1, "OK",'2020-05-14T01:00:00')
,("1_2", "1", 2, "OK",'2020-05-14T01:00:10')
,("1_3", "1", 3, "NOT OK",'2020-05-14T01:00:20')
,("2_1", "2", 1, "OK",'2020-05-14T01:00:00')
,("2_2", "2", 2, "NOT OK", '2020-05-14T01:00:10')
,("1_4", "1", 4, "OK",'2020-05-14T01:00:30')
,("1_5", "1", 5, "OK",'2020-05-14T01:00:40')
,("1_6", "1", 6, "OK",'2020-05-14T01:00:50')
;
Records: 8  Duplicates: 0  Warnings: 0
Select * FROM Table1 ORDER BY id, version;
id版本 id 版本 状态 dt
1_1 1 1 好的 2020-05-14 01:00:00
1_2 1 2 好的 2020-05-14 01:00:10
1_3 1 3 不行 2020-05-14 01:00:20
1_4 1 4 好的 2020-05-14 01:00:30
1_5 1 5 好的 2020-05-14 01:00:40
1_6 1 6 好的 2020-05-14 01:00:50
2_1 2 1 好的 2020-05-14 01:00:00
2_2 2 2 不行 2020-05-14 01:00:10

通过以下 CTE,我获得了所需的输出,仅显示 ID 更改和状态更改

WITH cte  AS (SELECT *,
  COALESCE(lag(status) OVER (partition by id order by id, version), "init") as last_status
FROM Table1
ORDER BY id, version
),
cte2 AS (
  SELECT *,
  LEAD(dt) OVER (partition by id order by id, version) - dt as time_diff FROM cte
WHERE status != last_status
)
SELECT * FROM cte2 WHERE time_diff IS NOT NULL;
id版本 id 版本 状态 dt 最后状态 时间_差异
1_1 1 1 好的 2020-05-14 01:00:00 初始化 20
1_3 1 3 不行 2020-05-14 01:00:20 好的 10
2_1 2 1 好的 2020-05-14 01:00:00 初始化 10

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.