sql - 如何根据另一列的聚合获得一列的相应值?

标签 sql greatest-n-per-group snowflake-cloud-data-platform maxby

我正在将一些 PostgreSQL 查询迁移到 Snowflake,并且正在努力复制以下查询:

WITH test_table(col1, col2, col3, col4) AS (
    VALUES 
        (1, 1, 7, 5),
        (1, 1, 6, 4),
        (1, 2, 1, 4),
        (1, 2, 2, 5),
        (1, 2, 3, 6)
)

SELECT
    col1,
    col2,
    (max(ARRAY[col3, col4]))[2]
FROM test_table
GROUP BY 1, 2
此查询设法获取 col4 的值对应于col3 grouped by col1, col2的最大值.但是,我没有找到任何优雅的解决方案来在 Snowflake 上复制它。

最佳答案

您可以按任何顺序聚合数组。所以你可以分组col3col4 订购:

with test_table(col1, col2, col3, col4) 
as (
    select * from (values 
        (1, 1, 20, 1), -- added 
        (1, 1, 7, 5),
        (1, 1, 6, 4),
        (1, 2, 1, 4),
        (1, 2, 2, 5),
        (1, 2, 3, 6))
)

SELECT
    col1,
    col2,
    array_agg(col4) within group(order by col3 desc) c4_by_max_c3
FROM test_table
GROUP BY 1, 2
enter image description here
您可以使用 [0] 选择最高的数字,而不是获取此数组。 :
SELECT
    col1,
    col2,
    array_agg(col4) within group(order by col3 desc)[0] c4_by_max_c3
FROM test_table
GROUP BY 1, 2
enter image description here
希望雪花也支持max_by future ,但尚未实现。同时这将起作用。

关于sql - 如何根据另一列的聚合获得一列的相应值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65906540/

相关文章:

mysql - SQL 仅选择列上具有最大值的行

mysql - 如何将mysql join query中的where cause应用于不同的表

mysql - 选择具有多个限制的值

mysql - SQL : loop through same table

sql-server-2008-r2 - Snowflake sql - 横向展平函数与 sql server 的比较 - Split_String()

sql - 展平嵌套数组并在雪花中聚合

snowflake-cloud-data-platform - 雪花多集群仓库性能对比大仓库规模的单仓库

mysql BETWEEN 对字符的权利是独占的吗?

mysql - 简单 SQL 最大列查询

sql - 限制每个组的行数从连接(不是 1 行)