Postgresql 聚合数组

新手上路,请多包涵

我有两张桌子

Student
--------
Id  Name
1   John
2   David
3   Will

Grade
---------
Student_id  Mark
1           A
2           B
2           B+
3           C
3           A

是否可以使本机 Postgresql SELECT 获得如下结果:

 Name    Array of marks
-----------------------
'John',     {'A'}
'David',    {'B','B+'}
'Will',     {'C','A'}

不像 下面

Name    Mark
----------------
'John',     'A'
'David',    'B'
'David',    'B+'
'Will',     'C'
'Will',     'A'

原文由 Eazy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 495
2 个回答

使用array_agg: http ://www.sqlfiddle.com/#!1/5099e/1

 SELECT s.name,  array_agg(g.Mark) as marks
FROM student s
LEFT JOIN Grade g ON g.Student_id = s.Id
GROUP BY s.Id

顺便说一句,如果您使用的是 Postgres 9.1, 则不需要将 SELECT 上的列重复 到 GROUP BY,例如,您不需要在 GROUP BY 上重复学生姓名。您只能对主键进行 GROUP BY。如果您删除学生的主键,则需要在 GROUP BY 上重复学生姓名。

 CREATE TABLE grade
    (Student_id int, Mark varchar(2));

INSERT INTO grade
    (Student_id, Mark)
VALUES
    (1, 'A'),
    (2, 'B'),
    (2, 'B+'),
    (3, 'C'),
    (3, 'A');

CREATE TABLE student
    (Id int primary key, Name varchar(5));

INSERT INTO student
    (Id, Name)
VALUES
    (1, 'John'),
    (2, 'David'),
    (3, 'Will');

原文由 Michael Buen 发布,翻译遵循 CC BY-SA 3.0 许可协议

据我了解,您可以执行以下操作:

 SELECT p.p_name,
    STRING_AGG(Grade.Mark, ',' ORDER BY Grade.Mark) As marks
FROM Student
LEFT JOIN Grade ON Grade.Student_id = Student.Id
GROUP BY Student.Name;

编辑

我不知道。但也许是这样的:

 SELECT p.p_name,
    array_to_string(ARRAY_AGG(Grade.Mark),';') As marks
FROM Student
LEFT JOIN Grade ON Grade.Student_id = Student.Id
GROUP BY Student.Name;

参考 这里

原文由 Arion 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进