Создание столбцов путем агрегации по условию в Snowflake SQL - PullRequest
0 голосов
/ 12 октября 2018

У меня есть следующая таблица:

id1 | id2  | n_products | daydiff
 a  |   1  |       12   |    12
 a  |   1  |       11   |    13
 a  |   1  |       90   |    46
 a  |   2  |       5    |    5
 b  |   2  |       15   |    15
 b  |   2  |       15   |    21
 c  |   3  |       90   |    7

Мне нужно агрегировать эту таблицу по id и использовать daydiff следующим образом:

  • , если daydiffменьше чем 14
  • , если daydiff находится между 14 и 28
  • , если daydiff больше 28.

, это должно быть агрегировано с использованием среднего.

Результат должен быть:

id1 |    id2  |  sub 14 | 14_28 | 28+
 a  |     1   |    11.5 |    0  |  46
 a  |     2   |    5    |    0  |  0
 b  |     2   |    0    |    15 |  0
 a  |     3   |    7    |    0  |  0

Как этого добиться?Я предполагаю, что это будет включать некоторые group by заявления, но я не уверен, как их следует применять

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Ответ Гордона кросс-платформенный, но для себя я предпочитаю снежинку IFF синтаксис

SELECT id1, id2,
    AVG(IFF(datediff < 14, n_products, NULL)) as avg_lt14,
    AVG(IFF(datediff >= 14 and datediff <= 28, n_products, NULL)) as avg_14_28,
    AVG(IFF(datediff > 29, n_products, NULL)) as avg_29pl
FROM t
GROUP BY id1, id2;
0 голосов
/ 12 октября 2018

Использовать условное агрегирование:

select id1, id2,
       avg(case when datediff < 14 then n_products end) as avg_lt14,
       avg(case when datediff >= 14 and datediff <= 28 then n_products end) as avg_14_28,
       avg(case when datediff > 29 then n_products end) as avg_29pl
from t
group by id1, id2;

В некоторых базах данных средние значения целых чисел вычисляются как целое число.Я не знаю, делает ли Снежинка это.Если это так, то измените n_products на n_products * 1.0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...