[英]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"
總的來說似乎可行,但我無法將它們組裝在一起..
考慮:
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 和 week 進行聚合,並進行條件求和以計算總數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.