Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql聚合数组_Sql_Arrays_Postgresql - Fatal编程技术网

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');