SQL сложная агрегация разных типов по скользящему окну - PullRequest
0 голосов
/ 14 апреля 2020

Я застрял, пытаясь создать запрос для следующей задачи. Может быть, кто-то может помочь мне.

Таблица ввода:

+--------+--------------+------+-----------+-----------+
| Index  | Week_end_day | Type | Num_val_1 | Num_val_2 |
+--------+--------------+------+-----------+-----------+
| D0024A | 30.06.2018   | A    |        10 |         0 |
| D0024A | 30.06.2018   | A    |        20 |         0 |
| D0024A | 30.06.2018   | B    |        30 |         1 |
| A0025A | 30.06.2018   | C    |         5 |         1 |
| A0025A | 30.06.2018   | B    |         4 |         1 |
| A0025A | 30.06.2018   | B    |         6 |         0 |
| D0024A | 14.07.2018   | C    |         5 |         1 |
| D0024A | 14.07.2018   | A    |        10 |         1 |
+--------+--------------+------+-----------+-----------+

Я хочу агрегировать данные по неделям, чтобы все числовые значения c были суммированы, но в то же время агрегировали некоторые категориальные значения другим числовым столбец (средний например). Также необходимо подсчитывать общее количество строк в неделю и рассчитывать каждый тип в неделю.

Таблица вывода:

+--------+----------+----------------------+----------------------+----------------------+--------------------------+--------------------------+--------------+---+---------------------+
| Index  | Week_Num | Type_A_avg_Num_val_1 | Type_B_avg_Num_val_1 | Type_C_avg_Num_val_1 | Sum_per_week - Num_val_1 | Sum_per_week - Num_val_2 | Type_A_count | . | total_count_in_week |
+--------+----------+----------------------+----------------------+----------------------+--------------------------+--------------------------+--------------+---+---------------------+
| D0024A |        1 | 15                   | 30                   | 5                    | 60                       | 1                        | 2            | . | 6                   |
| D0024A |        2 | 10                   | 22                   | 10                   | 10                       | 2                        | 1            | . | 4                   |
| D0024A |        3 | 12                   | 14                   | 7                    | 50                       | 0                        | 3            | . | 5                   |
| D0025A |        1 | .                    | .                    | .                    | .                        | .                        | .            | . | .                   |
| D0025A |        2 | .                    | .                    | .                    | .                        | .                        | .            | . | .                   |
+--------+----------+----------------------+----------------------+----------------------+--------------------------+--------------------------+--------------+---+---------------------+

Я дошел до этой черновой точки:

SELECT
    Index,
    dense_rank() over(order by Week_end_date) AS Week_Num
    SUM(Num_val_1) AS SUM_Num_val_1,
    SUM(Num_val_2) AS SUM_Num_val_2,
    -- need average
    AVG(CASE WHEN Type = 'A' THEN Num_val_1 END) AS TypeA_avg_Num_val_1
    ....

    -- need to count
    SUM(CASE WHEN Type = 'A' THEN 1 END) AS TypeA_count


FROM t1
GROUP BY Index, Week_end_date

Не могли бы вы взглянуть? Я получаю ошибки.

Кроме того, не знаю - важно ли, чтобы Index и Week_end_day не сортировались.

...