想要将多个聚合函数与雪花枢轴列函数一起使用

Posted

技术标签:

【中文标题】想要将多个聚合函数与雪花枢轴列函数一起使用【英文标题】:Want to use multiple aggregate function with snowflake pivot columns function 【发布时间】:2021-11-26 08:38:21 【问题描述】:
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代码,我如何在雪花中实现相同的逻辑

【问题讨论】:

您的表格中没有“年龄”列。数据如何返回?在枢轴的情况下,这有点奇怪。你能显示这样查询的结果吗? 这里有几个多列'pivot'的示例方法(***.com/questions/69017226/…)。如果您可以更正 DDL/SQL 中缺少的 AGE 列并提供具有预期输出的示例结果,我们可以根据您的用例调整其中一种方法。 【参考方案1】:

以下是 Snowflake 中 PIVOT 的语法:

SELECT ...
FROM ...
   PIVOT ( <aggregate_function> ( <pivot_column> )
            FOR <value_column> IN ( <pivot_value_1> [ , <pivot_value_2> ... ] ) )

[ ... ]

对于 Snowflake,您的 AS 关键字将位于 PIVOT 函数之外。

查看此示例以供参考:

select * 
  from monthly_sales
    pivot(sum(amount) for month in ('JAN', 'FEB', 'MAR', 'APR'))
      as p
  order by empid;

访问official document 并检查给定的示例以更好地理解。

【讨论】:

【参考方案2】:

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

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

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

SELECT * 
FROM 
    person 
    PIVOT (
        MAX(date) FOR name IN ('John', 'Mike')
    )
    as p (id, class, address, john, mike)
;

【讨论】:

【参考方案3】:

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>

【讨论】:

以上是关于想要将多个聚合函数与雪花枢轴列函数一起使用的主要内容,如果未能解决你的问题,请参考以下文章

开窗函数

SQL——连接查询聚合函数开窗函数

JPA NamedQuery 与聚合函数和分组依据一起使用

可以将聚合函数与连接一起使用吗?

Oracle 的用户自定义聚合函数可以定义为与两列一起使用吗?

尝试将多个函数聚合到新列时出现意外的 KeyError Pandas