SQL - Как сгруппировать / подсчитать элементы по возрасту и статусу в каждый день года - часть 2 - PullRequest
0 голосов
/ 09 июля 2020

Этот вопрос похож на другой вопрос, который я задал и ответил здесь: SQL - Как сгруппировать / подсчитать элементы по возрасту и статусу в каждый день года? но я не могу выяснить эту новую проблему. Мне нужна помощь с запросом, чтобы сгруппировать данные из приведенной ниже примерной таблицы в желаемые результаты ниже. Цель состоит в том, чтобы суммировать количество билетов в данном состоянии по группам в конце каждой последовательной даты, начиная с указанной даты и заканчивая текущей датой.

Пример таблицы данных (билеты):

ticket_id | opened    | assigned  | in_work  | closed     | assigned_group
---------------------------------------------------------------------------
 1          1/1/2020    1/2/2020    1/5/2020   1/5/2020     Network
 2          1/2/2020    1/3/2020    1/3/2020   1/5/2020     Software
 3          1/2/2020    1/5/2020                            Hardware
 4          1/2/2020                                        Network
 5          1/3/2020    1/4/2020    1/5/2020                Software
 6          1/3/2020                                        Network
... and more continuing in similar pattern

Желаемый результат:

Date      | assigned_group | num_open | num_assigned | num_in_work | num_closed |
---------------------------------------------------------------------------
 1/1/2020   Network          1            0              0             0 
 1/1/2020   Software         0            0              0             0 
 1/1/2020   Hardware         0            0              0             0 
 1/2/2020   Network          1            1              0             0 
 1/2/2020   Software         1            0              0             0 
 1/2/2020   Hardware         1            0              0             0 
 1/3/2020   Network          2            1              0             0 
 1/3/2020   Software         1            0              1             0 
 1/3/2020   Hardware         1            0              0             0  
 1/4/2020   Network          2            1              0             0 
 1/4/2020   Software         0            1              1             0 
 1/4/2020   Hardware         1            0              0             0 
 1/5/2020   Network          2            0              0             1 
 1/5/2020   Software         0            0              1             1 
 1/5/2020   Hardware         0            1              0             0  
... continuing to present date

Спасибо!

1 Ответ

0 голосов
/ 09 июля 2020

Вы можете развернуть и использовать кумулятивную сумму:

with da as (
      select opened as date, assigned_group, 1 as open_inc, 0 as assigned_inc, 0 as in_work_inc, 0 as closed_inc
      from t
      union all
      select assigned, assigned_group, -1, 1, 0, 0
      from t
      union all
      select in_work, assigned_group, 0 -1, 1, 0
      from t
      union all
      select closed, assigned_group, 0, 0, -1, 1
      from t
     )
select date, assigned_group,
       sum(sum(open_inc)) over (partition by assigned_group order by date) as num_opens,
       sum(sum(assigned_inc)) over (partition by assigned_group order by date) as num_assigned,
       sum(sum(in_work_inc)) over (partition by assigned_group order by date) as num_in_work,
       sum(sum(closed_inc)) over (partition by assigned_group order by date) as num_closed
from da
group by date, assigned_group
order by date, assigned_group;
...