-1
CREATE TABLE person (id INT, name STRING, date date, class INT, address STRING);
INSERT INTO person VALUES
    (100, 'John', 30-1-2021, 1, 'Street 1'),
    (200, 'Mary', 20-1-2021, 1, 'Street 2'),
    (300, 'Mike', 21-1-2021, 3, 'Street 3'),
    (100, 'John', 15-5-2021, 4, 'Street 4');
SELECT * FROM person
    PIVOT (
        **SUM(age) AS a, MAX(date) AS c**
        FOR name IN ('John' AS john, 'Mike' AS mike)
    );

这是上面的databricks sql代码,我如何在雪花中实现相同的逻辑

4

3 回答 3

0

首先,我可以从您的表 DDL 中看到没有“AGE”列。

其次,我认为您不能以多个聚合函数为中心,因为该值将放在提到的“JOHN”和“MIKE”列下以获取它们相应的聚合值,它不能放入两个单独的值中。我不知道您的 DataBricks 示例将如何工作。

删除一个聚合函数后,您的示例在 Snowflake 中将如下所示:

SELECT * 
FROM 
    person 
    PIVOT (
        MAX(date) FOR name IN ('John', 'Mike')
    )
    as p (id, class, address, john, mike)
;
于 2021-11-26T23:34:33.630 回答
0

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>
于 2021-12-05T04:28:18.517 回答
0

以下是 Snowflake 中 PIVOT 的语法:

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;

访问这个官方文档并检查给定的示例以获得更好的理解。

于 2021-11-26T10:39:36.300 回答