SQL 滚动聚合 window

SQL Aggregation with rolling window

希望有人能赐教。 我有一个基于每周的数据列 - 那一周的最后一天,还有类型和持续时间。 我想为每个 id 在每周的单独列中汇总每种类型的持续时间(将其添加到第 1 周、第 2 周等)。

所以,这是输入:

+-----+---------------+------+----------+
| 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"

总的来说似乎是可行的,但我不能assemble把它们放在一起..

考虑:

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

查询根据 table 中可用的日期动态生成周数(第一个日期为第 1 周,依此类推)。然后,我们按 id 和 week 进行聚合,并进行条件求和来计算总数。