Хотите использовать несколько агрегатных функций с функцией сводных столбцов снежинки
СОЗДАТЬ ТАБЛИЦУ человека (id INT, имя STRING, дата дата, класс INT, адрес STRING); ВСТАВИТЬ В ЗНАЧЕНИЯ человека (100, 'John', 30-1-2021, 1, 'Street 1'),(200, 'Mary', 20-1-2021, 1, 'Street 2'),(300, ' Майк », 21-1-2021, 3,« Улица 3 »), (100,« Джон », 15-5-2021, 4,« Улица 4 »);
ВЫБРАТЬ * ОТ человека PIVOT (СУММ (возраст) как a, MAX (дата) как cFOR имя IN ('Джон' как джон, 'Майк' как микрофон));
Это sql-код databricks, приведенный выше, как мне реализовать ту же логику в снежинке
3 ответа
Ниже приведен синтаксис PIVOT в Snowflake:
SELECT ...
FROM ...
PIVOT ( <aggregate_function> ( <pivot_column> )
FOR <value_column> IN ( <pivot_value_1> [ , <pivot_value_2> ... ] ) )
[ ... ]
В случае Снежинки ваш
AS
ключевое слово будет вне функции PIVOT.
Проверьте этот пример для справки:
select *
from monthly_sales
pivot(sum(amount) for month in ('JAN', 'FEB', 'MAR', 'APR'))
as p
order by empid;
Посетите этот официальный документ и ознакомьтесь с приведенными примерами для лучшего понимания.
Во-первых, нет столбца «ВОЗРАСТ», как я вижу из вашей таблицы DDL.
Во-вторых, я не думаю, что вы можете использовать несколько функций агрегирования, поскольку значение будет помещено в упомянутые столбцы «ДЖОН» и «МАЙК» для соответствующих им агрегированных значений, оно не может поместиться в два отдельных значения. Я не знаю, как будет работать ваш пример DataBricks.
Ваш пример будет выглядеть примерно так, как показано ниже в Snowflake после удаления одной функции агрегирования:
SELECT *
FROM
person
PIVOT (
MAX(date) FOR name IN ('John', 'Mike')
)
as p (id, class, address, john, mike)
;
Snowflake не поддерживает несколько агрегатных выражений в PIVOT.
И, как отмечают другие, ваш
AGE
отсутствует, и у вас также нет
ORDER BY
пункт, который усложняет развертывание вашего собственного SQL.
SELECT
SUM(IFF(name='John',age,null)) AS john_sum_age,
MAX(IFF(name='John',date,null)) AS john_max_date,
SUM(IFF(name='Mike',age,null)) AS mike_age,
MAX(IFF(name='Mike',date,null)) AS mike_max_date
FROM person
если бы у вас был ORDER BY в вашем примере, он стал бы предложением GROUP BY в этой форме
SELECT
<gouping_columns>,
SUM(IFF(name='John',age,null)) AS john_sum_age,
MAX(IFF(name='John',date,null)) AS john_max_date,
SUM(IFF(name='Mike',age,null)) AS mike_age,
MAX(IFF(name='Mike',date,null)) AS mike_max_date
FROM person
GROUP BY <gouping_columns>