Prz*_*mek 5 sql postgresql postgresql-9.1
假设我有一个agg_test包含 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| 4
9| 5| 3
10| 5| 4
Run Code Online (Sandbox Code Playgroud)
像这样的查询(带有自连接):
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
Run Code Online (Sandbox Code Playgroud)
会产生这样的结果:
column_1|column_1|array_agg
---------------------------
1| 2| {1}
1| 3| {2}
1| 4| {3,4}
1| 5| {3,4}
Run Code Online (Sandbox Code Playgroud)
我们可以看到,对于连接表中的值 4 和 5,我们在最后一列中得到相同的结果。那么,是否可以通过某种方式对结果进行分组,例如:
column_1|column_1|array_agg
---------------------------
1| {2}| {1}
1| {3}| {2}
1| {4,5}| {3,4}
Run Code Online (Sandbox Code Playgroud)
感谢您的任何答复。如果有任何不清楚或可以以更好的方式呈现的内容 - 请在评论中告诉我,我会尽力使这个问题具有可读性。
我不确定是否可以通过数组进行聚合。如果可以的话,这是一种方法:
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
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用array_dims将数组值转换为字符串。
| 归档时间: |
|
| 查看次数: |
15105 次 |
| 最近记录: |