Salut j'ai deux tables
Student
--------
Id Name
1 John
2 David
3 Will
Grade
---------
Student_id Mark
1 A
2 B
2 B+
3 C
3 A
Est-il possible de sélectionner Postgresql en natif pour obtenir des résultats comme celui-ci:
Name Array of marks
-----------------------
'John', {'A'}
'David', {'B','B+'}
'Will', {'C','A'}
Mais pas comme ça
Name Mark
----------------
'John', 'A'
'David', 'B'
'David', 'B+'
'Will', 'C'
'Will', 'A'
Utilisez 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
Par ailleurs, si vous utilisez Postgres 9.1, vous vous n'avez pas besoin de répéter les colonnes de SELECT to GROUP BY, par exemple. vous n'avez pas besoin de répéter le nom de l'étudiant sur GROUP BY. Vous pouvez simplement grouper par sur la clé primaire. Si vous supprimez la clé primaire de l'étudiant, vous devez répéter le nom de l'étudiant sur 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');
Ce que je comprends, vous pouvez faire quelque chose comme ça:
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;
[~ # ~] éditer [~ # ~]
Je ne suis pas sûr. Mais peut-être quelque chose comme ça alors:
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;
Référence ici
Vous pouvez utiliser les éléments suivants:
SELECT Student.Name as Name,
(SELECT array(SELECT Mark FROM Grade WHERE Grade.Student_id = Student.Id))
AS ArrayOfMarks
FROM Student
Comme décrit ici: http://www.mkyong.com/database/convert-subquery-result-to-array/
@ Michael Buen a bien compris. J'ai eu ce dont j'avais besoin en utilisant array_agg.
Voici juste un exemple de requête simple au cas où cela aiderait quelqu'un:
SELECT directory, ARRAY_AGG(file_name) FROM table WHERE type = 'Zip' GROUP BY directory;
Et le résultat était quelque chose comme:
parent_directory | array_agg | ------------------------+----------------------------------------+ /home/postgresql/files | {Zip_1.Zip,zip_2.Zip,zip_3.Zip} | /home/postgresql/files2 | {file1.Zip,file2.Zip} |
Ce message m'a également beaucoup aidé: "Group By" dans SQL et Python Pandas . Il indique qu’il est plus pratique d’utiliser uniquement le SQL lorsque cela est possible, mais que Python Pandas peut être utile pour obtenir des fonctionnalités supplémentaires dans le processus de filtrage.
J'espère que ça aide