簡體   English   中英

帶滾動窗口的 SQL 聚合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM