我正在尝试使用以下数据获取每个 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 |
首先修复表格,因为我确实有这些字段,我只是省略了它们
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 |