Postgresql集計配列


94

こんにちは、2つのテーブルがあります。

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

しかし、これ好きではありません

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

回答:


161

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

ちなみに、Postgres 9.1を使用している場合は、SELECTから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');

2
ああ私の選択/グループについてのあなたの発言について本当にありがとう、それはとても素晴らしいです!本当に面倒でした!
mrbrdo 2013

8

私が理解していることは、次のようなことができるということです。

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;

ここで参照


彼はコンマ区切りの文字列ではなくpgsql配列を望んでいると思います
ThiefMaster


0

@Michael Buenはそれを正しく理解しました。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のパンダでの "Group By"にも大いに役立ちました。基本的に、可能な場合はSQLのみを使用する方が便利ですが、Python Pandasはフィルタリングプロセスで追加の機能を実現するのに役立ちます。

それが役に立てば幸い

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.