SQL Агрегация с подвижным окном - PullRequest
1 голос
/ 12 марта 2020

надеюсь, что кто-то сможет просветить меня. У меня есть еженедельные данные с колонкой - последний день этой недели, а также тип и продолжительность. И я хочу агрегировать продолжительность для каждого типа в отдельном столбце для каждой недели (получить его на неделе № 1, неделе № 2 и т. Д. c.) Для каждого идентификатора.

Итак, это входные данные:

+-----+---------------+------+----------+
| id  | week end date | type | duration |
+-----+---------------+------+----------+
| 101 | 14.07.2017    | A    | 5        |
| 101 | 14.07.2017    | A    | 1        |
| 101 | 14.07.2017    | B    | 4        |
| 101 | 14.07.2017    | C    | 2        |
| 101 | 21.07.2017    | A    | 4        |
| …   | …             | …    | …        |
| 102 | 14.07.2017    | A    | 2        |
| 102 | 14.07.2017    | B    | 4        |
+-----+---------------+------+----------+

Вот что я пытаюсь получить:

+---------+----------+-------+-------+---+
|     id  | Week num | A_sum | B_sum | … |
+---------+----------+-------+-------+---+
|     101 |        1 |     6 |     4 |   |
|     101 |        2 |     5 |     8 |   |
|     101 |        3 |     5 |     5 |   |
|     …   |          |       |       |   |
|     102 |        1 |     5 |     2 |   |
|     102 |        2 |     8 |     2 |   |
+---------+----------+-------+-------+---+

Для этого случая количество типов невелико, поэтому мы можем вручную определить новые столбцы как SUM(CASE WHEN type='A' THEN duration ELSE 0 END) "A"

В целом кажется возможным, но я не могу собрать все это вместе ..

1 Ответ

3 голосов
/ 12 марта 2020

Рассмотрим:

select
    id,
    dense_rank() over(order by week_end_date) week_num
    sum(case when type = 'A' then duration end) a,
    sum(case when type = 'B' then duration end) b,
    sum(case when type = 'C' then duration end) c
from mytable
group by id, week_end_date

Запрос динамически генерирует номера недель на основе дат, доступных в таблице (первая дата получает неделю 1 и т. Д.). Затем мы агрегируем по id и неделе и делаем условные суммы для вычисления итогов.

...