У меня есть две таблицы
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'
sql
arrays
postgresql
Eazy
источник
источник
Насколько я понимаю, вы можете сделать что-то вроде этого:
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;
Ссылка здесь
источник
Вы можете использовать следующее:
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/
источник
@ Майкл Буэн правильно понял. Я получил то, что мне нужно, с помощью 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 Pandas . В основном это говорит о том, что по возможности удобнее использовать только SQL, но что Python Pandas может быть полезен для достижения дополнительных функций в процессе фильтрации.
Я надеюсь, что это помогает
источник