Хотите использовать несколько агрегатных функций с функцией сводных столбцов снежинки

СОЗДАТЬ ТАБЛИЦУ человека (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>
Другие вопросы по тегам