Вопрос по postgresql, sql, arrays – Postgresql агрегатный массив

64

Привет у меня есть два стола

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

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

Можно ли сделать родной Postgresql, чтобы получить результаты, как это:

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

Ноnot как это

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

Ваш Ответ

4   ответа
108

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 по первичному ключу. Если вы удалите первичный ключ для студента, вам нужно будет повторить имя студента в 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');
О, Боже, спасибо вам большое за ваше замечание по поводу выбора / группы, это так здорово! Это было действительно раздражает!
4

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/

4

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;

EDIT

Я не уверен. Но может быть что-то вроде этого:

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;

СсылкаВот

Я думаю, что он хочет массив pgsql, а не разделенную запятыми строку
Обновить ответ
0

@ Майкл Буэн понял все правильно..

Вот лишь базовый пример запроса на случай, если он кому-нибудь поможет:

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} |

Этот пост также очень помог мне:& quot; Группировать по & quot; в SQL и Python Pandas. It basically says that it is more convenient to use only SQL when possible, but that Python Pandas can be useful to achieve extra functionalities in the filtering process.

Я надеюсь, что это помогает

Похожие вопросы