首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres查询返回的不仅仅是array_agg

Postgres查询返回的不仅仅是array_agg
EN

Stack Overflow用户
提问于 2012-09-11 21:38:12
回答 2查看 2.7K关注 0票数 1

以下是数据的格式:

代码语言:javascript
复制
item_name | item_serial | sub_group | conc_stuff | other_data | more_data
----------+-------------+-----------+------------+------------+-----------
foo        bar-01-a      widget      b-3          towel        dent
foo        bar-02-a      widget      a-1          42           mouse
foo        bar-03-a      widget      p-1          babel        dolphin
foo3       bar-21-f      widget      f-1          42           marvin
foo3       bar-22-f      widget      x-1          poetry       vogon

我已经让查询按照我想要的方式执行了,问题是我需要返回更多的数据。

代码语言:javascript
复制
SELECT item_name, 
       array_to_string(array_agg(conc_stuff), ',') as stuff 
FROM dataset 
WHERE some_selector = 'X' 
GROUP BY item_name 
ORDER BY item_name;

我尝试了一些在我看来简单而又合乎逻辑的方法:

代码语言:javascript
复制
SELECT item_name, 
       item_serial, 
       sub_group, 
       array_to_string(array_agg(conc_stuff), ',') as stuff 
FROM dataset 
WHERE some_selector = 'X' 
GROUP BY item_name 
ORDER BY item_name;

我需要返回类似如下的内容:

代码语言:javascript
复制
item_name | item_serial | sub_group |   stuff
----------+-------------+-----------+-------------
foo        bar-01-a      widget      a-1,b-3,p-1
foo3       bar-21-f      widget      f-1,x-1,g-5
foo6       bar-81-z      widget      r-1,d-8,w-0

不只是这样:

代码语言:javascript
复制
item_name |   stuff
----------+--------------
foo        a-1,b-3,p-1
foo3       f-1,x-1,g-5
foo6       r-1,d-8,w-0

当我尝试向查询中添加额外的字段时,我得到:

ERROR: column "stuff.item_serial" must appear in the GROUP BY clause or be used in an aggregate function

但是我不想GROUP BY item_serial,我只想把它和聚合一起返回,对吧?

我需要运行子查询吗?我相信这很简单。如果有多个方法,哪一个是最有效的?我将连接的一些文本是坐标(大的文本字符串)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-12 04:17:42

您需要为您拥有的每个名称选择一个值。您不能让每个名称只返回一次,而是多次返回item_serial值。

从组值的那些值中选择一个值是通过聚合函数完成的:

代码语言:javascript
复制
SELECT item_name,
       min(item_serial),
       min(sub_group),
       array_to_string(array_agg(conc_stuff),',') AS stuff
FROM dataset
WHERE sub_group = 'widget'
GROUP BY item_name
ORDER BY item_name;

这将为每个名称选择th4e "first“item_serialsub_group

如果需要最后一个值,请改用max

但需要理解的重要一点是,您必须为未分组的列选择一个值。您需要通过提供一个聚合函数来选择一个值,从而确切地告诉DBMS应该使用哪一个值。

SQLFiddle示例:http://www.sqlfiddle.com/#!1/58009/1

票数 2
EN

Stack Overflow用户

发布于 2012-09-12 03:03:33

在这一点上,Postgres 8.4比最近的Pg版本更严格。使用GROUP BY时,需要对不包含聚合函数的所有字段进行分组。

从Pg9.1开始,如果您使用GROUP BY主键,则可以省略所有其他未分组的字段。

希望能有所帮助。

编辑:

代码语言:javascript
复制
SELECT 
  item_name, 
  item_serial, 
  sub_group, 
  array_to_string(array_agg(conc_stuff), ',') as stuff 
FROM 
  dataset 
WHERE 
  some_selector = 'X' 
GROUP BY 
  item_name,
  item_serial,
  sub_group 
ORDER BY 
  item_name;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12371026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档