web-dev-qa-db-ja.com

Postgresql集合配列

こんにちは、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'}

しかしnotこのように

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

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

私が理解していることは、あなたはこのようなことをすることができます:

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;

参照 ここ

5
Arion

次を使用できます。

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
niko

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


この投稿は私にも大いに役立ちました: "Group By" in SQL and Python Pandas 。 that Python Pandasは、フィルタリングプロセスで追加の機能を実現するのに役立ちます。

私はそれが役立つことを願っています

0
Javi