简体   繁体   English

从顺序数据中选择分组数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM