所以我有一个包含EMAIL和订单ID的表。
EMAIL | id
--------------
Y@a.com | 1
Y@a.com | 2
X@a.com | 3
我需要SELECT
它,以便我有一个独特的电子邮件列和一个int的数组的ids列
EMAIL | ids
--------------
Y@a.com | [1,2]
X@a.com | [3]
我使用PSQL 9.3。我查看了聚合函数,但由于我对SQL atm不太好,所以我并没有真正理解它们。到目前为止我的代码是:
SELECT DISTINCT ON (email) email
FROM order
WHERE date > '2013-01-01';
答案 0 :(得分:2)
使用聚合函数array_agg()
:
SELECT email, array_agg(id) AS id_array
FROM "order"
WHERE date > '2013-01-01'
GROUP BY email;
不要将order
用作表名,而是reserved word
不要使用date
作为列名,它是标准SQL中的保留字和Postgres中的基本类型名称。
我也不会使用id
作为列名,这是一种常见的反模式,但“id”不是描述性名称。一旦你加入了几个表,就会有n列名为“id”,你需要开始处理列别名,而不是说它可能造成的混乱。
相反,请使用以下内容:
CREATE TABLE order_data (
order_data_id serial PRIMARY KEY
, email text
, order_date date
);