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

Я пытаюсь создать запрос из многолетнего набора данных (tickets таблица) заявок в службу поддержки с соответствующими столбцами ticked_id, status, created_on дата и closed_on дата для каждого запроса . Существует также общая c dates таблица, которую я могу присоединить / запросить к списку дат.

Я хотел бы создать диаграмму «выгорания» за этот год, которая отображает количество открытых билеты, которым исполнилось не менее одного года в любой день этого года. Мне удалось создать таблицы, в которых используется оператор sum(case... для группировки по дате - например, чтобы показать, сколько билетов было создано за данную неделю, - но я не могу понять, как сгруппировать по дням или неделям в этой год количество билетов, которые были открыты в этот день, и возраст не менее года.

Любая помощь приветствуется.

Данные примера:

ticket_id | status | created_on | closed_on
--------------------------------------------
 1          open     1/5/2019     
 2          open     1/26/2019
 3          closed   1/28/2019    2/1/2020
 4          open     6/1/2019
 5          closed   6/5/2019     1/1/2020

Результаты примера I Искать:

Date (2020)    |     Count of Year+ Aged Tickets
------------------------------------------------
1/1/2020             0
1/2/2020             0
1/3/2020             0
1/4/2020             0
1/5/2020             1
1/6/2020             1
... (skipping dates here but want all dates in results)...
1/25/2020            1
1/26/2020            2
1/27/2020            2
1/28/2020            3
1/29/2020            3
1/30/2020            3
1/31/2020            3
2/1/2020             2
... (skipping dates here but want all dates up to current date in results)...
  • ticket_id 1 5 января 2020 года исполнился один год и он все еще открыт (остается в подсчете)
  • ticket_id 2 достиг одного года возраст на 26.01.2020 и все еще открыт (остается в подсчете)
  • ticket_id 3 исполнился один год на 28.01.2020 и все еще был открыт, добавляя к счету, но был закрыт 01.02.2020, уменьшение счетчика
  • ticket_id 4 добавит к счету, только если он все еще открыт 01.06.2020, но не, если он будет закрыт до этого
  • ticket_id 5 никогда не появится в подсчете, потому что он никогда не достиг возраста одного года и закрыт

Ответы [ 2 ]

1 голос
/ 30 мая 2020

Один из вариантов - построить последовательный список дат, затем привести таблицу с «левым соединением» и условным логом c и, наконец, агрегировать.

Это даст результаты, которые вы хотите получить за год 2020.

select d.dt, count(t.ticket_id) no_tickets
from (
    select date '2020-01-01' + I * interval '1 day' dt 
    from generate_series(0, 365) i 
) d
left join mytable t
    on t.created_on + interval '1 year' <= d.dt 
    and (
        t.closed_on is null 
        or t.closed_on > d.dt
    )
group by d.dt

Если ваша версия Redshift не поддерживает generate_series(), вы можете эмулировать ее в виде таблицы пользовательских номеров или с помощью row_number() для большой таблицы (скажем, mylargetable):

select d.dt, count(t.ticket_id) no_tickets
from (
    select date '2020-01-01' + row_number() over(order by 1) * interval '1 day' dt 
    from mylargetable 
) d
left join mytable t
    on t.created_on + interval '1 year' <= d.dt 
    and (
        t.closed_on is null 
        or t.closed_on > d.dt
    )
where d.dt < date '2021-01-01'
group by d.dt
0 голосов
/ 30 мая 2020

Если ticket_id уникален, вы можете сделать это, чтобы получить все билеты возрастом не менее 1 года

select ticket_id, created_on , status where status = 'open' and created_on <= dateadd(year,-1,getdate())

, если вы хотите подсчитать количество билетов в месяц, то

select count(ticket_id), month(created_on) , status where status = 'open' and created_on <= dateadd(year,-1,getdate())
group by month(created_on)
...