如何根据另一列的聚合得到一列的对应值?
How can I get the corresponding value of a column based on an aggregate of another column?
我正在将一些 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 上复制它。
您可以按任意顺序聚合数组。因此,您可以按 col4
:
对 col3
进行分组
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
,但尚未实现。同时这会起作用。
我正在将一些 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 上复制它。
您可以按任意顺序聚合数组。因此,您可以按 col4
:
col3
进行分组
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
,但尚未实现。同时这会起作用。