Mảng tổng hợp postgresql


95

Xin chào, tôi có hai bàn

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

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

Có thể thực hiện chọn Postgresql gốc để nhận được kết quả như thế này không:

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

Nhưng không phải như thế này

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

Câu trả lời:


163

Sử dụng 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

Nhân tiện, nếu bạn đang sử dụng Postgres 9.1, bạn không cần phải lặp lại các cột trên SELECT to GROUP BY, ví dụ bạn không cần lặp lại tên sinh viên trên GROUP BY. Bạn chỉ có thể GROUP BY trên khóa chính. Nếu bạn xóa khóa chính trên học sinh, bạn cần lặp lại tên học sinh trên 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');

2
Ôi trời, cảm ơn bạn rất nhiều về nhận xét của bạn về lựa chọn / nhóm, điều đó thật tuyệt vời! Điều đó thực sự khó chịu!
mrbrdo

8

Những gì tôi hiểu bạn có thể làm điều gì đó như sau:

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;

BIÊN TẬP

Tôi không chắc. Nhưng có thể một cái gì đó như thế này sau đó:

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;

Tham khảo tại đây


Tôi nghĩ rằng ông muốn có một mảng pgsql, không phải là một chuỗi bằng dấu phẩy
ThiefMaster


0

@Michael Buen đã hiểu đúng. Tôi đã nhận được những gì tôi cần bằng cách sử dụng array_agg.

Đây chỉ là một ví dụ truy vấn cơ bản trong trường hợp nó giúp ai đó:

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

Và kết quả là:

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


Bài đăng này cũng đã giúp tôi rất nhiều: "Group By" trong SQL và Python Pandas . Về cơ bản, nó nói rằng sẽ thuận tiện hơn khi chỉ sử dụng SQL khi có thể, nhưng Python Pandas có thể hữu ích để đạt được các chức năng bổ sung trong quá trình lọc.

Tôi hy vọng nó sẽ giúp

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.