Вычислить длительность времени для каждого идентификатора агента, agenttatusid, даты ----- sql server 2014 - PullRequest
0 голосов
/ 30 апреля 2020

Имея таблицу, как показано ниже:

Agentid.   availabilitystatusid.      createdtime
93.        1                     2020-02-16 19:59:34.347
88         1                     2020-02-16 17:55:16.663
1          1                     2020-02-16 16:11:34.100
88         9                     2020-02-16 12:10:37.101
88         3                     2020-02-16 12:08:20.678
88.        1                     2020-02-16 12:04:35.567
93.        5                     2020-02-16 11:59:00.789
88.        7                     2020-02-08 20:08:09.654
67         4                     2020-02-08 13:34:45.476 
......
.....

Изображение ниже:

Table like this - Limited data though

Данные содержат различные

  1. Agentid's,
  2. 13 различных статусов доступности (таких как онлайн, готовность, перерыв, время молитвы, назначенная работа и т. Д. c.) И
  3. Даты с 2019 по 2020 г. по февраль .

Я ищу:

Agentid.   availabilitystatusid.   date.            duration (in hours)
88.            1                   2020-02-16       0.2
88             3                   2020-02-16       3
1              7                   2020-02-03.      8
....
..

Для каждого Agentid, для каждого statusid, для каждой даты мне нужна продолжительность в часах.

Спасибо заранее!

1 Ответ

0 голосов
/ 30 апреля 2020

Вы можете использовать оконную функцию lead(), чтобы получить createdtime «следующей» записи, а затем агрегировать.

Это дает вам общее время, которое каждый агент провел в каждом статусе:

select
    agentid,
    availabilitystatusid,
    sum(datediff(hour, createdtime, lead_createdtime)) duration_hours
from (
    select 
        t.*,
        lead(createdtime) 
            over(partition by agentid order by createdtime) lead_createdtime
    from mytabe t
) t
group by agentid, availabilitystatusid

Предполагая, что периоды не охватывают несколько дней - или что вы хотите привязать продолжительность к дню, когда начатый период, вы можете сделать:

select
    agentid,
    availabilitystatusid,
    sum(datediff(hour, createdtime, lead_createdtime)) duration_hours,
    date(createdtime) created_day
from (
    select 
        t.*,
        lead(createdtime) 
            over(partition by agentid order by createdtime) lead_createdtime
    from mytabe t
) t
group by agentid, availabilitystatusid, date(createdtime)
...