以下是数据的格式:
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我已经让查询按照我想要的方式执行了,问题是我需要返回更多的数据。
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;我尝试了一些在我看来简单而又合乎逻辑的方法:
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;我需要返回类似如下的内容:
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不只是这样:
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,我只想把它和聚合一起返回,对吧?
我需要运行子查询吗?我相信这很简单。如果有多个方法,哪一个是最有效的?我将连接的一些文本是坐标(大的文本字符串)。
发布于 2012-09-12 04:17:42
您需要为您拥有的每个名称选择一个值。您不能让每个名称只返回一次,而是多次返回item_serial值。
从组值的那些值中选择一个值是通过聚合函数完成的:
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_serial和sub_group。
如果需要最后一个值,请改用max。
但需要理解的重要一点是,您必须为未分组的列选择一个值。您需要通过提供一个聚合函数来选择一个值,从而确切地告诉DBMS应该使用哪一个值。
SQLFiddle示例:http://www.sqlfiddle.com/#!1/58009/1
发布于 2012-09-12 03:03:33
在这一点上,Postgres 8.4比最近的Pg版本更严格。使用GROUP BY时,需要对不包含聚合函数的所有字段进行分组。
从Pg9.1开始,如果您使用GROUP BY主键,则可以省略所有其他未分组的字段。
希望能有所帮助。
编辑:
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;https://stackoverflow.com/questions/12371026
复制相似问题