Как я могу определить начало и конец действий в наборе данных? - PullRequest
4 голосов
/ 20 мая 2019

В моем наборе данных много дел, и я хочу взглянуть на данные с другой точки зрения.Вот почему мне нужно указать начальный и конечный моменты, но как?

Я уже пытался определить минимальные и максимальные моменты как ручного, так и автоматического.Но как определить другие моменты начала и окончания?

UPDATE Test_Table
    SET Activity = 'Start Manual'
    FROM Test_Table b, 
    (
        SELECT ID,  MIN(rownumber) as a FROM Test_Table
        WHERE Activity = 'Manual'
        GROUP BY ID) a
    WHERE   b.rownumber <= a.a AND Activity = 'Manual'
    and b.ID = a.ID

UPDATE Test_Table
    SET Activity = 'End Manual'
    FROM Test_Table b, 
    (
        SELECT ID,  MAX(rownumber) as a FROM Test_Table
        WHERE Activity = 'Manual'
        GROUP BY ID) a
    WHERE   b.rownumber >= a.a AND Activity = 'Manual'
    and b.ID = a.ID

UPDATE Test_Table
    SET Activity = 'Start Automatic'
    FROM Test_Table b, 
    (
        SELECT ID,  MIN(rownumber) as a FROM Test_Table
        WHERE Activity = 'Automatic'
        GROUP BY ID) a
    WHERE   b.rownumber <= a.a AND Activity = 'Automatic'
    and b.ID = a.ID

UPDATE Test_Table
    SET Activity = 'End Automatic'
    FROM Test_Table b, 
    (
        SELECT ID,  MAX(rownumber) as a FROM Test_Table
        WHERE Activity = 'Automatic'
        GROUP BY ID) a
    WHERE   b.rownumber >= a.a AND Activity = 'Automatic'
    and b.ID = a.ID

Это пример значений таблицы:

ID  Activity    Datetime        Rownumber        Type_Activity
A   Manual  2019-04-23 11:17:12     1            0
A   Manual  2019-04-23 11:17:57     2            0
A   Manual  2019-04-23 11:18:53     3            0
A   Manual  2019-04-23 11:19:49     4            0
A   Automatic 2019-04-23 11:26:50   5            1
A   Automatic 2019-04-23 11:42:30   6            1
A   Automatic 2019-04-23 11:43:31   7            1
A   Automatic 2019-04-23 11:44:32   8            1
A   Manual  2019-04-24 03:35:06     9            0
A   Manual  2019-04-24 03:36:01     10           0
A   Manual  2019-04-24 03:36:57     11           0
A   Manual  2019-04-24 03:37:48     12           0
A   Manual  2019-04-24 03:38:44     13           0
A   Manual  2019-04-24 03:39:40     14           0
A   Manual  2019-04-24 03:40:46     15           0
A   Manual  2019-04-24 03:41:52     16           0
A   Automatic 2019-04-24 04:26:50   17           1
A   Automatic 2019-04-24 04:42:30   18           1
A   Automatic 2019-04-24 04:43:31   19           1
A   Automatic 2019-04-24 04:44:32   20           1

Я ожидал следующего:

ID  Activity    Datetime                    Activity2
A   Manual  2019-04-23 11:17:12.000         Start Manual
A   Manual  2019-04-23 11:17:57.000 
A   Manual  2019-04-23 11:18:53.000 
A   Manual  2019-04-23 11:19:49.000         End Manual
A   Automatic 2019-04-23 11:26:50.000       Start Automatic
A   Automatic 2019-04-23 11:42:30.000   
A   Automatic 2019-04-23 11:43:31.000   
A   Automatic 2019-04-23 11:44:32.000       End Automatic
A   Manual  2019-04-24 03:35:06.000         Start Manual
A   Manual  2019-04-24 03:36:01.000 
A   Manual  2019-04-24 03:36:57.000 
A   Manual  2019-04-24 03:37:48.000 
A   Manual  2019-04-24 03:38:44.000 
A   Manual  2019-04-24 03:39:40.000 
A   Manual  2019-04-24 03:40:46.000 
A   Manual  2019-04-24 03:41:52.000         End Manual
A   Automatic 2019-04-24 04:26:50           Start Automatic
A   Automatic 2019-04-24 04:42:30   
A   Automatic 2019-04-24 04:43:31   
A   Automatic 2019-04-24 04:44:32           End Automatic

Ответы [ 2 ]

3 голосов
/ 20 мая 2019

Использование задержки / опережения

Select t1.*,
       case 
           when lag(activity) over(partition by ID order by datetime) <> activity then 'Start '+Activity
           when lead(activity) over(partition by ID order by datetime) <> activity then 'End '+Activity
       end as Act2
from MyTable t1

Или самостоятельное присоединение

with CTE as
(
select t1.*, row_number() over (partition by ID order by datetime) rn
from MyTable t1
)
select t1.*,
       case 
         when t1.Activity <> t2.activity then 'Start '+t1.Activity
         when t1.Activity <> t3.Activity then 'End ' +t1.Activity 
       end as Act2
from CTE t1
left join CTE t2
on t2.rn = t1.rn+1
left join CTE t3
on t3.rn = t1.rn-1

Примечание. В любое время, когда действие происходит один раз, будет только «Старт»

0 голосов
/ 20 мая 2019

Вы можете использовать приведенный ниже код для достижения того же.

 ;WITH CTE
    AS
    (
       select ID 
              ,Activity
              ,Datetime  
       ROW_NUMBER() OVER(PARTITION BY Activity, CAST(Datetime AS DATE) ORDER BY Datetime) AS Rnk
       ,ROW_NUMBER() OVER(PARTITION BY Activity, CAST(Datetime AS DATE) ORDER BY Datetime DESC) AS Rnk1
,Activity2
       FROM Test_Table
    )
    UPDATE CTE
    SET Activity2 = CASE WHEN Rnk = 1 THEN 'Start'+CAST(Activity AS NVARCHAR(20)) WHEN Rnk1 = 1 THEN 'End'+CAST(Activity AS NVARCHAR(20)) ELSE '' END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...