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 进行聚合,并进行条件求和来计算总数。
希望有人能赐教。 我有一个基于每周的数据列 - 那一周的最后一天,还有类型和持续时间。 我想为每个 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 进行聚合,并进行条件求和来计算总数。