聚合数组

我有两张桌子

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


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

是否可以使用本地 Postgreql 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'
111565 次浏览

你可以使用以下方法:

SELECT Student.Name as Name,
(SELECT array(SELECT Mark FROM Grade WHERE Grade.Student_id = Student.Id))
AS ArrayOfMarks
FROM Student

正如这里所描述的: http://www.mkyong.com/database/convert-subquery-result-to-array/

据我所知,你可以这么做:

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;

参考资料 给你

使用 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 to GROUP BY 上的列,例如,您不需要重复 GROUP BY 上的学生名称。只能在主键上使用 GROUP BY。如果删除 Student 上的主键,则需要在 GROUPBY 上重复学生名称。

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 做对了,我使用 array _ agg 得到了我需要的东西。

这里只是一个基本的查询例子,如果它有助于某人:

SELECT directory, ARRAY_AGG(file_name)
FROM table
WHERE type = 'ZIP'
GROUP BY directory;

结果是这样的:

|     parent_directory    |                 array_agg              |
+-------------------------+----------------------------------------+
| /home/postgresql/files  | {zip_1.zip,zip_2.zip,zip_3.zip}        |
| /home/postgresql/files2 | {file1.zip,file2.zip}                  |

这篇文章也帮了我很多: SQL 和 Python Panda 中的“ GroupBy”。 它基本上是说,如果可能的话,只使用 PSQL 会更方便,但是 Python Panda 可以在过滤过程中实现额外的功能。