Postgresql聚合数组
我有两张桌子Postgresql聚合数组,sql,arrays,postgresql,Sql,Arrays,Postgresql,我有两张桌子 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
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'
您可以使用以下选项:
SELECT Student.Name as Name,
(SELECT array(SELECT Mark FROM Grade WHERE Grade.Student_id = Student.Id))
AS ArrayOfMarks
FROM Student
如下所述:据我所知,您可以这样做:
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;
参考使用数组集合:
顺便说一句,如果您使用的是Postgres 9.1,您可以在“选择分组依据”上选择列,例如,您不需要在“分组依据”上重复学生姓名。您只能按主键分组。如果删除学生上的主键,则需要在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');
@迈克尔·布恩说得对。我用array_agg得到了我需要的东西 这里只是一个基本的查询示例,以防对某人有所帮助:
从表中选择目录、数组和AGG(文件名),其中type='ZIP'按目录分组代码>
结果是:
parent_directory | array_agg |------------------------------------------+/home/postgresql/files |{zip_1.zip,zip_2.zip,zip_3.zip}|/home/postgresql/files2{file1.zip,file2.zip}
这篇文章也帮了我很多。
它基本上说,在可能的情况下,只使用PSQL更方便,但是Python在过滤过程中实现额外的功能是有用的
我希望这能有所帮助我想他想要的是pgsql数组,而不是逗号分隔的字符串哦,我的天啊,非常感谢你对select/group的评论,太棒了!真烦人!
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');