【发布时间】:2015-12-15 09:27:10
【问题描述】:
取下表:
CREATE TABLE boxes (
box integer,
color character varying,
size integer,
...
);
box 和 color 都可以假设不是唯一值
设置。
查询此表:
SELECT color, box FROM boxes;
结果会是这样的:
+-------+-----+
| color | box |
+-------+-----+
| blue | 2 |
| blue | 3 |
| blue | 4 |
| green | 1 |
| green | 3 |
| red | 1 |
| red | 2 |
| red | 2 |
+-------+-----+
是否可以以这样的方式查询该表,使得结果有两列,一列有一个数组(或字符串或列表),每个不同的box 值都有不同的color?
结果应该是这样的:
+-------+-----------+
| color | box_types |
+-------+-----------+
| blue | {2,3,4} |
| green | {1,3} |
| red | {1,2} |
+-------+-----------+
其中color 列必须包含唯一值,并且每行在聚合列中必须仅包含不同的box 数字。
鉴于这个问题的不可知性,我想为主要 DBMS 收集所有最佳解决方案。回答时,请指定每个查询适用于哪个 DBMS。
【问题讨论】:
-
这不是真正的 SQL 做事方式。但是,一些 dbms 产品具有 GROUP_CONCAT 和 STUFF 等功能。
-
我想有人必须将所有答案合并为一个......
-
是的,这就是目的。
-
既然你做了 GROUP BY 颜色,没有 DISTINCT 的 SELECT 就可以了。 (通常 GROUP BY 时不需要 SELECT DISTINCT。)
-
经过更多测试后,我发现仅使用
group_concat()或array_agg()之类的函数不会从结果聚合列中删除重复项。我对问题进行了编辑,以更清楚地说明每个结果行必须只包含不同的框值。
标签: sql concatenation aggregate-functions