如何根据另一列的聚合得到一列的对应值?

Posted

技术标签:

【中文标题】如何根据另一列的聚合得到一列的对应值?【英文标题】:How can I get the corresponding value of a column based on an aggregate of another column? 【发布时间】:2021-04-30 13:02:42 【问题描述】:

我正在将一些 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

此查询设法获得与col3 grouped by col1, col2 的最大值相对应的col4 的值。但是,我没有找到任何优雅的解决方案可以在 Snowflake 上复制它。

【问题讨论】:

请添加一些示例源数据,以便大家轻松复制您的结果。 【参考方案1】:

您可以按任何顺序聚合数组。所以你可以将col3 分组,按col4 排序:

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

您可以使用[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

希望 Snowflake 将来也支持max_by,但尚未实现。同时这将起作用。

【讨论】:

效果很好!非常感谢

以上是关于如何根据另一列的聚合得到一列的对应值?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据火花DataFrame中另一列的值更改列的值

如何根据另一列的值获取单行值?

Pyspark:如何根据另一列的值填充空值

Pyspark数据帧:根据另一列的值提取列

当percentile_approx基于groupby返回特定列的单个值时,如何选择另一列的对应值?

如何根据R中另一列的日期(月/日/年)计算列的年/月平均值、最大值、最小值等