我正在寻找一种通过查询连接组内字段的字符串的方法.例如,我有一张桌子:
ID COMPANY_ID EMPLOYEE
1 1 Anna
2 1 Bill
3 2 Carol
4 2 Dave
Run Code Online (Sandbox Code Playgroud)
我想通过company_id分组得到类似的东西:
COMPANY_ID EMPLOYEE
1 Anna, Bill
2 Carol, Dave
Run Code Online (Sandbox Code Playgroud)
mySQL中有一个内置函数来执行这个group_concat
我正在使用PostgreSQL 9.1并需要帮助将多行连接在一起.我需要在2个表中这样做.当我使用两次array_agg()函数时,我得到结果中的重复值.
表:
CREATE TABLE rnp (id int, grp_id int, cabinets varchar(15) );
INSERT INTO rnp VALUES
(1,'11','cabs1')
,(2,'11','cabs2')
,(3,'11','cabs3')
,(4,'11','cabs4')
,(5,'22','c1')
,(6,'22','c2');
CREATE TABLE ips (id int, grp_id int, address varchar(15));
INSERT INTO ips VALUES
(1,'11','NY')
,(2,'11','CA')
,(3,'22','DC')
,(4,'22','LA');
Run Code Online (Sandbox Code Playgroud)
SQL:
SELECT DISTINCT
rnp.grp_id,
array_to_string(array_agg(rnp.cabinets)OVER (PARTITION BY rnp.grp_id), ',') AS cabinets,
array_to_string(array_agg(ips.address) OVER (PARTITION BY ips.grp_id), ',') AS addresses
FROM rnp JOIN ips ON rnp.grp_id=ips.grp_id
Run Code Online (Sandbox Code Playgroud)
结果:
GRP_ID CABINETS ADDRESSES
11 cabs1,cabs1,cabs2,cabs2,cabs3,cabs3,cabs4,cabs4 NY,CA,NY,CA,NY,CA,NY,CA
22 c1,c1,c2,c2 DC,LA,DC,LA
Run Code Online (Sandbox Code Playgroud)
而我需要的是:
GRP_ID CABINETS …Run Code Online (Sandbox Code Playgroud) 我有下表MyTable:
id ? value_two ? value_three ? value_four
???????????????????????????????????????????
1 ? a ? A ? AA
2 ? a ? A2 ? AA2
3 ? b ? A3 ? AA3
4 ? a ? A4 ? AA4
5 ? b ? A5 ? AA5
Run Code Online (Sandbox Code Playgroud)
我想查询{ value_three, value_four }按组分组的对象数组value_two.value_two应该在结果中独立存在.结果应如下所示:
value_two ? value_four
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
a ? [{"value_three":"A","value_four":"AA"}, {"value_three":"A2","value_four":"AA2"}, {"value_three":"A4","value_four":"AA4"}]
b ? [{"value_three":"A3","value_four":"AA3"}, {"value_three":"A5","value_four":"AA5"}]
Run Code Online (Sandbox Code Playgroud)
它是否使用json_agg()或无关紧要array_agg().
然而,我能做的最好的事情是:
with MyCTE as ( select …Run Code Online (Sandbox Code Playgroud) 我在postgresql上遇到了第一次痛苦的经历,当下的分钟挑战是:
如何在postgresql中执行concat_ws,通过以下方式从组中连接多个字段值:
select concat_ws(';',field_lambda) from table_lambda group by id;
Run Code Online (Sandbox Code Playgroud) 除了问题如何通过'查询连接PostgreSQL'组中的字符串字段的字符串?
如何按降序对员工进行排序?
我正在使用不支持的PostgreSQL 8.4 string_agg().我试过使用以下内容,但不支持:
array_to_string(array_agg(employee ORDER BY employee DESC), ',')
Run Code Online (Sandbox Code Playgroud)
我很欣赏任何正确答案的暗示.
我正在使用PostgreSQL 9.1,我有这样的数据结构:
A B
-------
1 a
1 a
1 b
1 c
1 c
1 c
1 d
2 e
2 e
Run Code Online (Sandbox Code Playgroud)
我需要一个产生这个结果的查询:
1 4 {{c,3},{a,2},{b,1},{d,1}}
2 1 {{e,2}}
Run Code Online (Sandbox Code Playgroud)
A = 1,4行总共A = 1,部分计数(3行带c值,2行带值,.....)
数组所需的排序基于每个组的计数(如示例3,2,1,1).
从上一篇文章中,我在sqlite3中有以下视图:
CREATE View AttendeeTableView AS
SELECT (LastName || " " || FirstName) as AttendeeName,
CompanyName,
PhotoURI,
CompanyAttendeeRelation.CompanyId,
CompanyAttendeeRelation.AttendeeId
FROM Attendee
JOIN CompanyAttendeeRelation on CompanyAttendeeRelation.AttendeeId = Attendee.AttendeeId
ORDER BY LastName;
Run Code Online (Sandbox Code Playgroud)
现在,由于数据是从Attendee和之间的多对多关系生成的Company,我可以得到如下结果:
Doe John | company A | johnPic.png | 1 | 15
Doe John | company B | johnPic.png | 2 | 15
Run Code Online (Sandbox Code Playgroud)
我想做的是,在有多个公司(如上所述)的情况下,创建一个输出的查询:
Doe John | company A company B | johnPic.png | 1 2 | 15
Run Code Online (Sandbox Code Playgroud)
另一个输出:
Doe John | company A | company B …Run Code Online (Sandbox Code Playgroud)