Postgresql聚合数组

Eld*_*dar 85 sql arrays postgresql

嗨我有两张桌子

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

Grade
---------
Student_id  Mark
1           A
2           B
2           B+
3           C
3           A
Run Code Online (Sandbox Code Playgroud)

是否有可能使本机Postgresql选择得到这样的结果:

Name    Array of marks
-----------------------
'John',     {'A'}
'David',    {'B','B+'}
'Will',     {'C','A'}
Run Code Online (Sandbox Code Playgroud)

不是这样的

Name    Mark
----------------
'John',     'A'
'David',    'B'
'David',    'B+'
'Will',     'C'
'Will',     'A'
Run Code Online (Sandbox Code Playgroud)

Mic*_*uen 144

使用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
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果你使用的是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');
Run Code Online (Sandbox Code Playgroud)

  • 哦,天哪,非常感谢你关于select/group的评论,这真是太棒了!那太烦人了! (2认同)

Jav*_*avi 10

迈克尔·布恩说得对。我使用 array_agg 得到了我需要的东西。

这里只是一个基本的查询示例,以防它对某人有帮助:

SELECT directory, ARRAY_AGG(file_name) 
FROM table 
WHERE type = 'ZIP' 
GROUP BY directory;
Run Code Online (Sandbox Code Playgroud)

结果是这样的:

|     parent_directory    |                 array_agg              |  
+-------------------------+----------------------------------------+
| /home/postgresql/files  | {zip_1.zip,zip_2.zip,zip_3.zip}        |
| /home/postgresql/files2 | {file1.zip,file2.zip}                  |     
Run Code Online (Sandbox Code Playgroud)

这篇文章也对我有很大帮助:“Group By” in SQL and Python Pandas。它基本上说,在可能的情况下仅使用 PSQL 会更有效,但 Python Pandas 可用于在过滤过程中实现额外的功能。


nik*_*iko 6

您可以使用以下内容:

SELECT Student.Name as Name,
       (SELECT array(SELECT Mark FROM Grade WHERE Grade.Student_id = Student.Id))
       AS ArrayOfMarks 
FROM Student
Run Code Online (Sandbox Code Playgroud)

如此处所述:http : //www.mkyong.com/database/convert-subquery-result-to-array/


Ari*_*ion 6

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

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;
Run Code Online (Sandbox Code Playgroud)

编辑

我不确定。但是也许是这样的:

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;
Run Code Online (Sandbox Code Playgroud)

这里参考