[英]Select grouping data from sequential data
PID STATUS START_TIME END_TIME
1 NW NULL 2019-08-01 10:32:18
1 IP 2019-08-01 10:32:18 2019-08-01 10:33:17
1 IP 2019-08-01 10:33:17 2019-08-01 10:33:31
1 PD 2019-08-01 10:33:31 2019-08-01 10:35:26
1 PD 2019-08-01 10:35:26 2019-08-01 10:36:00
1 IP 2019-08-01 10:36:00 2019-08-01 10:36:25
1 CP 2019-08-01 10:36:25 2019-08-01 13:35:19
1 CP 2019-08-01 13:35:19 2019-08-01 13:37:42
1 CP 2019-08-01 13:37:42 NULL
Hi, for now i have the above data in the table and i want to group the status in sequential order. 嗨,现在我在表中有上述数据,我想按顺序对状态进行分组。
This is the current query that i use 这是我使用的当前查询
SELECT * FROM (
SELECT ID, STATUS,
LAG(STATUS , 1,0) OVER (PARTITION BY PID ORDER BY START_TIME) AS PREVIOUS ,
MAX(START_TIME) as STARTTIME,
MIN(END_TIME) as ENDTIME
FROM T_SUBPROCESSLOG
GROUP BY PID, STATUS, START_TIME) tmp
WHERE tmp.STATUS <> tmp.PREVIOUS
ORDER BY STARTTIME
And it give me the result like this 它给我这样的结果
PID STATUS PREVIOUS START_TIME END_TIME
1 NW 0 NULL 2019-08-01 10:32:18
1 IP NW 2019-08-01 10:32:18 2019-08-01 10:33:17
1 PD IP 2019-08-01 10:33:31 2019-08-01 10:35:26
1 IP PD 2019-08-01 10:36:00 2019-08-01 10:36:25
1 CP IP 2019-08-01 10:36:25 2019-08-01 13:35:19
I expected the result to be 我期望结果是
PID STATUS PREVIOUS START_TIME END_TIME
1 NW 0 NULL 2019-08-01 10:32:18
1 IP NW 2019-08-01 10:32:18 2019-08-01 10:33:31
1 PD IP 2019-08-01 10:33:31 2019-08-01 10:36:00
1 IP PD 2019-08-01 10:36:00 2019-08-01 10:36:25
1 CP IP 2019-08-01 10:36:25 NULL
as you can see, i want the start_time is the MIN value of the grouping result, and the end_time is the MAX value of the grouping result. 如您所见,我希望start_time是分组结果的MIN值,而end_time是分组结果的MAX值。
Does this help? 这有帮助吗? Not sure how it will work with lots of data...
不确定如何处理大量数据...
with T_SUBPROCESSLOG (PID, STATUS, START_TIME, END_TIME) as
(SELECT 1 , 'NW' , NULL , '2019-08-01 10:32:18' UNION
SELECT 1, 'IP', '2019-08-01 10:32:18', '2019-08-01 10:33:17' UNION
SELECT 1, 'IP', '2019-08-01 10:33:17', '2019-08-01 10:33:31' UNION
SELECT 1, 'PD', '2019-08-01 10:33:31', '2019-08-01 10:35:26' UNION
SELECT 1, 'PD', '2019-08-01 10:35:26', '2019-08-01 10:36:00' UNION
SELECT 1, 'IP', '2019-08-01 10:36:00', '2019-08-01 10:36:25' UNION
SELECT 1, 'CP', '2019-08-01 10:36:25', '2019-08-01 13:35:19' UNION
SELECT 1, 'CP', '2019-08-01 13:35:19', '2019-08-01 13:37:42' UNION
SELECT 1, 'CP', '2019-08-01 13:37:42', NULL)
SELECT PID ,
STATUS,
PREVIOUS,
STARTTIME,
CASE WHEN NEXTSTART = '0' THEN NULL ELSE
ISNULL((SELECT END_TIME FROM T_SUBPROCESSLOG d
WHERE d.PID = tmp.PID and d.status = tmp.status AND d.START_TIME = tmp.NEXTSTART),
(SELECT END_TIME FROM T_SUBPROCESSLOG d
WHERE d.PID = tmp.PID and d.status = tmp.status AND ISNULL(d.START_TIME,'1990/01/01') = ISNULL(tmp.CURRENTSTART,'1990/01/01')))
END ENDTIME
FROM (
SELECT PID, STATUS,
LAG(STATUS , 1,0) OVER (PARTITION BY PID ORDER BY START_TIME) AS PREVIOUS ,
MAX(START_TIME) as STARTTIME,
--- MIN(END_TIME) as ENDTIME
START_TIME as CURRENTSTART,
LEAD(START_TIME , 1,0) OVER (PARTITION BY PID ORDER BY START_TIME) AS NEXTSTART
--- ROW_NUMBER() OVER (PARTITION BY PID ORDER BY START_TIME DESC) AS AROW
FROM T_SUBPROCESSLOG l
GROUP BY PID, STATUS, START_TIME) tmp
WHERE tmp.STATUS <> tmp.PREVIOUS
ORDER BY STARTTIME
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.