SQL Сумма по разделу «НЕ» по столбцу - PullRequest
2 голосов
/ 27 мая 2020
• 1000 Предположим, у меня есть таблица со столбцами hour, dim_a, dim_b, metric_a, metric_b, metric_c со значениями, показанными в csv ниже
hour,dim_a,dim_b,metric_a,metric_b
0,A,X,4,4
0,A,Y,4,24
0,B,Y,20,24
1,B,Y,21,35
1,A,Y,4,35
1,C,Y,10,35
2,B,Y,21,30
2,C,Y,3,30
2,A,Y,6,30

Взгляните на metric_b. Это значение c всегда одинаково, если значения hour и dim_b одинаковы, независимо от значения dim_a. Например:

1,B,Y,21,35
1,A,Y,4,35
1,C,Y,10,35

Если мы выберем столбцы hour, dim_b, metric_b и возьмем различные значения, таблица будет выглядеть так:

hour,dim_b,metric_b
0,X,4
0,Y,24
1,Y,35
2,Y,30

И по этим значениям все необходимо выполнить агрегирование по metric_b

Я хотел бы выполнять аналитические запросы по этой группировке данных, задавая c измерения и выполняя агрегирование показателей со специальным агрегированием, когда дело доходит до metric_b.

  1. , когда я хочу сгруппировать по hour, dim_a, dim_b и увидеть показатели metric_a и metric_b. Ожидаемый результат:
hour,dim_a,dim_b,metric_a,metric_b
0,A,X,4,4
0,A,Y,4,24
0,B,Y,20,24
1,B,Y,21,35
1,A,Y,4,35
1,C,Y,10,35
2,B,Y,21,30
2,C,Y,3,30
2,A,Y,6,30
Когда я хочу сгруппировать по dim_a, dim_b и увидеть показатели metric_a и metric_b. Ожидаемый результат:
dim_a,dim_b,metric_a,metric_b
A,X,4,4
A,Y,14,89
B,Y,62,89
C,Y,13,89

Значение metric_b рассчитывается из 89 = 24 + 35 + 30; 4 = 4

Когда я хочу сгруппировать по dim_b и увидеть метри c. metric_a и metric_b. Ожидаемый результат:
dim_b,metric_a,metric_b
X,4,4
Y,89,89

Значение metric_b рассчитывается из 89 = 24 + 35 + 30; 4 = 4

И, наконец, когда я хочу сгруппировать по dim_a и увидеть метри c. metric_a и metric_b. Ожидаемый результат:
dim_a,metric_a,metric_b
A,18,93
B,62,93
C,13,93

Значение metric_b рассчитывается из 93 = 24 + 35 + 30 + 4

Таким образом, агрегирование metric_b должно быть суммой из metric_b, но не принимая учетные записи dim_a в качестве столбца группировки, но принимая все остальное. Есть ли синтаксис SQL, который может помочь мне в этом?

Более того, я хотел бы сказать, что эти запросы будут выполняться на AWS Redshift, и есть 20 показателей и измерение 16, то есть 36 столбцов. И строк там будет до 100 миллиардов.

1 Ответ

1 голос
/ 27 мая 2020

для числа 2:

SELECT *
FROM (
    SELECT dim_a
        ,dim_b
        ,sum(metric_a) a
    FROM dbo.Table_2 t
    GROUP BY dim_a
        ,dim_b
    ) a
CROSS APPLY (
    SELECT sum(metric_b) b
    FROM (
        SELECT DISTINCT metric_b
            ,hour
            ,dim_b
        FROM dbo.Table_2
        ) t2
    WHERE t2.dim_b = a.dim_b
    ) c

для числа 3:

SELECT *
FROM (
    SELECT dim_b
        ,sum(metric_a) a
    FROM dbo.Table_2 t
    GROUP BY dim_b
    ) a
CROSS APPLY (
    SELECT sum(metric_b) b
    FROM (
        SELECT DISTINCT metric_b
            ,hour
            ,dim_b
        FROM dbo.Table_2
        ) t2
    WHERE t2.dim_b = a.dim_b
    ) c

для числа 4:

SELECT *
FROM (
    SELECT dim_a
        ,sum(metric_a) a
    FROM dbo.Table_2 t
    GROUP BY dim_a
    ) a
CROSS APPLY (
    SELECT sum(metric_b) b
    FROM (
        SELECT DISTINCT metric_b
            ,hour
            ,dim_b
        FROM dbo.Table_2
        ) t2
    ) c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...