Eld*_*dar 85 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
Run Code Online (Sandbox Code Playgroud)
是否有可能使本机Postgresql选择得到这样的结果:
Name Array of marks
-----------------------
'John', {'A'}
'David', {'B','B+'}
'Will', {'C','A'}
Run Code Online (Sandbox Code Playgroud)
但不是这样的
Name Mark
----------------
'John', 'A'
'David', 'B'
'David', 'B+'
'Will', 'C'
'Will', 'A'
Run Code Online (Sandbox Code Playgroud)
Mic*_*uen 144
使用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
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果你使用的是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');
Run Code Online (Sandbox Code Playgroud)
Jav*_*avi 10
迈克尔·布恩说得对。我使用 array_agg 得到了我需要的东西。
这里只是一个基本的查询示例,以防它对某人有帮助:
SELECT directory, ARRAY_AGG(file_name)
FROM table
WHERE type = 'ZIP'
GROUP BY directory;
Run Code Online (Sandbox Code Playgroud)
结果是这样的:
| parent_directory | array_agg |
+-------------------------+----------------------------------------+
| /home/postgresql/files | {zip_1.zip,zip_2.zip,zip_3.zip} |
| /home/postgresql/files2 | {file1.zip,file2.zip} |
Run Code Online (Sandbox Code Playgroud)
这篇文章也对我有很大帮助:“Group By” in SQL and Python Pandas。它基本上说,在可能的情况下仅使用 PSQL 会更有效,但 Python Pandas 可用于在过滤过程中实现额外的功能。
您可以使用以下内容:
SELECT Student.Name as Name,
(SELECT array(SELECT Mark FROM Grade WHERE Grade.Student_id = Student.Id))
AS ArrayOfMarks
FROM Student
Run Code Online (Sandbox Code Playgroud)
如此处所述:http : //www.mkyong.com/database/convert-subquery-result-to-array/
据我了解,您可以执行以下操作:
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;
Run Code Online (Sandbox Code Playgroud)
编辑
我不确定。但是也许是这样的:
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;
Run Code Online (Sandbox Code Playgroud)
这里参考
归档时间: |
|
查看次数: |
55057 次 |
最近记录: |