Sql 按聚合进行聚合(数组\聚合)?
假设我有一个简单的表agg_测试,有3列-id、column_1和column_2。数据集,例如:Sql 按聚合进行聚合(数组\聚合)?,sql,postgresql,postgresql-9.1,Sql,Postgresql,Postgresql 9.1,假设我有一个简单的表agg_测试,有3列-id、column_1和column_2。数据集,例如: id|column_1|column_2 -------------------- 1| 1| 1 2| 1| 2 3| 1| 3 4| 1| 4 5| 2| 1 6| 3| 2 7| 4| 3 8| 4
id|column_1|column_2
--------------------
1| 1| 1
2| 1| 2
3| 1| 3
4| 1| 4
5| 2| 1
6| 3| 2
7| 4| 3
8| 4| 4
9| 5| 3
10| 5| 4
具有自联接的类似查询:
SELECT
a1.column_1,
a2.column_1,
ARRAY_AGG(DISTINCT a1.column_2 ORDER BY a1.column_2)
FROM agg_test a1
JOIN agg_test a2 ON a1.column_2 = a2.column_2 AND a1.column_1 <> a2.column_1
WHERE a1.column_1 = 1
GROUP BY a1.column_1, a2.column_1
我们可以看到,对于联接表中的值4和5,我们在最后一列中得到了相同的结果。那么,是否有可能以某种方式对结果进行分组,例如:
column_1|column_1|array_agg
---------------------------
1| {2}| {1}
1| {3}| {2}
1| {4,5}| {3,4}
谢谢你的回答。如果有什么不清楚或无法以更好的方式呈现,请在评论中告诉我,我会尽量让这个问题可读。我不确定是否可以通过数组进行聚合。如果可以,这里有一种方法:
select col1, array_agg(col2), ar
from (SELECT a1.column_1 as col1, a2.column_1 as col2,
ARRAY_AGG(DISTINCT a1.column_2 ORDER BY a1.column_2) as ar
FROM agg_test a1 JOIN
agg_test a2
ON a1.column_2 = a2.column_2 AND a1.column_1 <> a2.column_1
WHERE a1.column_1 = 1
GROUP BY a1.column_1, a2.column_1
) t
group by col1, ar
另一种方法是使用array_dims将数组值转换为字符串。您也可以尝试以下方法:
column_1|column_1|array_agg
---------------------------
1| 2| {1}
1| 3| {2}
1| 4| {3,4}
1| 5| {3,4}
SELECT DISTINCT
a1.column_1,
ARRAY_AGG(a2.column_1) OVER (
PARTITION BY
a1.column_1,
ARRAY_AGG(DISTINCT a1.column_2 ORDER BY a1.column_2)
) AS "a2.column_1 agg",
ARRAY_AGG(DISTINCT a1.column_2 ORDER BY a1.column_2)
FROM agg_test a1
JOIN agg_test a2 ON a1.column_2 = a2.column_2 AND a1.column_1 a2.column_1
WHERE a1.column_1 = 1
GROUP BY a1.column_1, a2.column_1
;
突出显示的部分与您在问题中发布的查询不同
上面使用一个窗口数组_AGG将a2.column_1的值与另一个数组_AGG的值组合在一起,使用后者的结果作为分区标准之一。如果没有DISTINCT,它将为您的示例生成两个{4,5}行。因此,需要使用DISTINCT来消除重复项
下面是一个SQL Fiddle演示:
但是请注意,窗口数组_AGG不能像它的普通对应项那样具有ORDER BY。这意味着列表中a2.column_1值的顺序将是不确定的,尽管在链接的演示中,它确实与预期输出中的值匹配