Как рассчитать разницу во времени при изменении значения столбца? - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь написать запрос, чтобы получить накопленную разницу во времени относительно изменения значения в столбце в SQL Server 2012.

Я пытаюсь собрать аналитику о том, сколько времени было выполнено задачейв ожидании другого пользователя, в этом задании 2 участника. Role = 0 - исполнитель, а Role = 1 - рецензент задачи.Во время выполнения задачи исполнитель и рецензент могут выполнять действия над задачей несколько раз.Цель состоит в том, чтобы получить общее время ожидания для рецензента и исполнителя.Чтобы заново создать моментальный снимок данных, см. Пример ниже

CREATE TABLE ActivityTable
([Id] [int] IDENTITY(1,1) NOT NULL,
[RoleId] [int] NULL,
[ActivityDate] [DATETIME] NULL)

INSERT INTO [ActivityTable] VALUES (1, '2018-10-19 13:00:19.840')
INSERT INTO [ActivityTable] VALUES (1, '2018-10-19 13:00:18.073')
INSERT INTO [ActivityTable] VALUES (1, '2018-10-19 12:59:48.417')
INSERT INTO [ActivityTable] VALUES (0, '2018-10-15 13:48:00.557')
INSERT INTO [ActivityTable] VALUES (0, '2018-10-15 12:56:25.567')
INSERT INTO [ActivityTable] VALUES (0, '2018-10-15 12:56:09.967')
INSERT INTO [ActivityTable] VALUES (0, '2018-10-15 12:55:26.500')
INSERT INTO [ActivityTable] VALUES (0, '2018-10-15 12:53:17.997')
INSERT INTO [ActivityTable] VALUES (1, '2018-10-15 12:36:17.967')
INSERT INTO [ActivityTable] VALUES (1, '2018-10-15 12:35:38.497')
INSERT INTO [ActivityTable] VALUES (1, '2018-10-15 12:33:05.860')
INSERT INTO [ActivityTable] VALUES (1, '2018-10-15 12:32:07.793')
INSERT INTO [ActivityTable] VALUES (1, '2018-10-15 12:32:00.010')
INSERT INTO [ActivityTable] VALUES (0, '2018-10-15 12:18:18.417')
INSERT INTO [ActivityTable] VALUES (0, '2018-10-15 12:17:16.370')
INSERT INTO [ActivityTable] VALUES (0, '2018-10-15 12:11:48.590')
INSERT INTO [ActivityTable] VALUES (0, '2018-10-15 11:58:38.557')
INSERT INTO [ActivityTable] VALUES (0, '2018-10-15 11:56:23.820')`

Таким образом, общее время для каждого перехода будет выглядеть следующим образом:

RoleInfo  Start Time               End Time                 Duration Minutes
0         2018-10-15 11:56:23.820  2018-10-15 12:32:00.010  37
1         2018-10-15 12:32:00.010  2018-10-15 12:53:17.997  22
0         2018-10-15 12:53:17.997  2018-10-19 12:59:48.417  5767
1         2018-10-19 12:59:48.417  2018-10-19 13:00:19.840  1

, а ожидаемый конечный результат - агрегирование ожидающихраз

RoleInfo  Duration in Minutes
0         5804
1         23

1 Ответ

0 голосов
/ 29 марта 2019

ссылки на комментарии в запросе.

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

select  RoleId, Duration = sum(datediff(minute, StartTime, EndTime))
from
(
    -- perform a group by RoleId + grp
    -- min() and max() on ActivityDate will gives you based on RoleId
    -- however you wanted the StartTime of next RoleId. For this LEAD() OVER() is used
    select  RoleId, 
            StartTime = min(ActivityDate), 
            EndTime   = coalesce(lead(min(ActivityDate)) over (order by min(ActivityDate)), 
                                 max(ActivityDate))
    from
    (
        -- identify the group. each group is continuous same RoleId value
        select  *, grp = Id - dense_rank() over (partition by RoleId 
                                                     order by ActivityDate desc)
        from    ActivityTable
    ) a
    group by RoleId, grp
) b
group by RoleId

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

/* RESULT
    RoleId  Duration
    0       5802
    1       22
*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...