Postgresql 집계 배열


95

안녕하세요 저는 두 개의 테이블이 있습니다

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'

답변:


163

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

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 Pandas의 "Group By" 라는 많은 도움이되었습니다 . 기본적으로 가능한 경우 SQL 만 사용하는 것이 더 편리하지만 Python Pandas는 필터링 프로세스에서 추가 기능을 달성하는 데 유용 할 수 있습니다.

도움이 되길 바랍니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.