Postgresql Postgres按数组列分组
我有一份学生和家长的名单,我想用学生证把他们分成几个家庭。共享普通学生id的家长可以被视为一个家庭,而共享普通家长id的学生也可以被视为一个家庭。这是一个示例表:Postgresql Postgres按数组列分组,postgresql,group-by,array-agg,Postgresql,Group By,Array Agg,我有一份学生和家长的名单,我想用学生证把他们分成几个家庭。共享普通学生id的家长可以被视为一个家庭,而共享普通家长id的学生也可以被视为一个家庭。这是一个示例表: p_id | parent_name | s_id | student_name | ------------------------------------------| 1 | John Doe | 100 | Mike Doe | 3 | Jane Doe | 100 | Mike Do
p_id | parent_name | s_id | student_name |
------------------------------------------|
1 | John Doe | 100 | Mike Doe |
3 | Jane Doe | 100 | Mike Doe |
3 | Jane Doe | 105 | Lisa Doe |
5 | Will Willy | 108 | William Son |
我想以这样的方式结束:
parents | students |
-------------------|------------------------|
John Doe, Jane Doe | Mike Doe, Lisa Doe |
Will Willy | William Son |
为了实现这一点,我目前正在使用:
SELECT array_agg(parents) AS parents FROM (
SELECT array_agg(p_id) AS par_ids, array_agg(parent_name) AS parents, student_name, s_id
FROM (
/* sub query */
)b
GROUP BY s_id, student_name
ORDER BY parents ASC
)c
GROUP BY unnest(par_ids)
ORDER BY parents ASC
但是我得到一个错误:错误:无法累积不同维度的数组
<代码>SQL状态:2202E
我怎样才能达到预期的结果?
来自上述语句的内部查询返回:
| par_ids | parents | student_name | s_id |
--------------------------------|------------------------|
| {1,3} | {John Doe, Jane Doe}| Mike Doe | 100 |
| {3} | {Jane Doe} | Lisa Doe | 105 |
| {5} | {Will Willy} | William Son | 108 |
现在,将这些学生归为家长是我的难题。我已经做了类似的事情(但有点复杂):
p\u id
值聚合到一个数组中:
苏伊德
父母
108
{5}
105
{3}
100
{1,3}
我已经在这里做了类似的事情(但有点复杂):
p\u id
值聚合到一个数组中:
苏伊德
父母
108
{5}
105
{3}
100
{1,3}
谢谢这真的帮了我大忙。我想不出办法,谢谢。这真的帮了我大忙。我想不出一个解决办法。
SELECT
array_agg(parent_name) as parents, -- 4
array_agg(student_name) as students
FROM (
SELECT DISTINCT ON (t.s_id) -- 3
*
FROM (
SELECT
s_id,
array_agg(p_id) as parents -- 1
FROM mytable
GROUP BY s_id
) s JOIN mytable t ON t.p_id = ANY(s.parents) -- 2
ORDER BY t.s_id, CARDINALITY(parents) DESC -- 3
) s
GROUP BY parents