gpt4 book ai didi

sql - 数组联合作为聚合函数

转载 作者:行者123 更新时间:2023-11-29 11:19:49 25 4
gpt4 key购买 nike

我有以下输入:

name  | count | options
-----------------------
user1 | 3 | ['option1', 'option2']
user1 | 12 | ['option2', 'option3']
user2 | 2 | ['option1', 'option3']
user2 | 1 | []

我想要以下输出:

name  | count | options
-----------------------
user1 | 12 | ['option1', 'option2', 'option3']
user2 | 2 | ['option1', 'option3']

我按名字分组。对于每个组,计数应聚合为 max,选项应聚合为 union。我很难弄清楚后者是怎么做的。

目前,我有这个查询:

with data(name, count, options) as (
select 'user1', 12, array['option1', 'option2']::text[]
union all
select 'user1', 12, array['option2', 'option3']::text[]
union all
select 'user2', 2, array['option1', 'option3']::text[]
union all
select 'user2', 1, array[]::text[]
)
select name, max(count)
from data
group by name

http://rextester.com/YTZ45626

我知道这可以通过定义自定义聚合函数轻松完成,但我想通过查询来完成。我了解 unnest() 数组的基础知识(以及 array_agg() 稍后的结果),但不知道如何在我的查询中注入(inject)它。

最佳答案

您可以在 FROM 列表中使用 unnest(options) 来使用隐式横向连接,然后使用 array_agg(distinct v) 来使用以下选项创建一个数组:

with data(name, count, options) as (
select 'user1', 12, array['option1', 'option2']::text[]
union all
select 'user1', 12, array['option2', 'option3']::text[]
union all
select 'user2', 2, array['option1', 'option3']::text[]
union all
select 'user2', 1, array[]::text[]
)
select name, array_agg(distinct v) -- the 'v' here refers to the 'f(v)' alias below
from data, unnest(options) f(v)
group by name;
┌───────┬───────────────────────────┐
│ name │ array_agg │
├───────┼───────────────────────────┤
│ user1 │ {option1,option2,option3} │
│ user2 │ {option1,option3} │
└───────┴───────────────────────────┘
(2 rows)

关于sql - 数组联合作为聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44048336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com