web-dev-qa-db-fra.com

Tableau agrégé Postgresql

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'
80
Eldar

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');
136
Michael Buen

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

5
Arion

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/

4
niko

@ 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

0
Javi