SQL-创建SQL以加入列表
我有下表:SQL-创建SQL以加入列表,sql,postgresql,postgresql-9.5,Sql,Postgresql,Postgresql 9.5,我有下表: CREATE temp TABLE "t_table" ( usr_id bigint, address varchar[], msg_cnt bigint, usr_cnt bigint, source varchar[], last_update timestamp ); 添加数据: INSERT INTO "t_table"(usr_id, address, msg_cnt, usr_cnt, source, last_update) VALUES (
CREATE temp TABLE "t_table" (
usr_id bigint,
address varchar[],
msg_cnt bigint,
usr_cnt bigint,
source varchar[],
last_update timestamp
);
添加数据:
INSERT INTO "t_table"(usr_id, address, msg_cnt, usr_cnt, source, last_update) VALUES (1, '{44.154.48.125,81.134.82.111,95.155.38.120,94.134.88.136}', 10, 3, '{src1,src2}', '2019-10-16 22:16:22.163000');
INSERT INTO "t_table"(usr_id, address, msg_cnt, usr_cnt, source, last_update) VALUES (2, '{44.154.48.125}', 10, 3, '{src1,src3}', '2019-10-16 22:16:22.163000');
INSERT INTO "t_table"(usr_id, address, msg_cnt, usr_cnt, source, last_update) VALUES (3, '{94.134.88.136}', 10, 3, '{src1,src4}', '2019-10-16 22:16:22.163000');
INSERT INTO "t_table"(usr_id, address, msg_cnt, usr_cnt, source, last_update) VALUES (4, '{127.0.0.1}', 10, 3, '{src1,src5}', '2019-10-16 22:16:22.163000');
INSERT INTO "t_table"(usr_id, address, msg_cnt, usr_cnt, source, last_update) VALUES (5, '{127.0.0.1,5.5.5.5}', 10, 3, '{src1,src3}', '2019-10-16 22:16:22.163000');
INSERT INTO "t_table"(usr_id, address, msg_cnt, usr_cnt, source, last_update) VALUES (6, '{1.1.0.9}', 10, 3, '{src1,src2}', '2019-10-16 22:16:22.163000');
查找共享地址的用户
预期成果:
| users | address | sum_msg_cnt | sum_usr_cnt | max_last_date | source |
|---------------------------------|-------------------------------------------------------------|--------------|------------------|--------------------------------|-----------------------------|
| {1,2,3} | {44.154.48.125,81.134.82.111,95.155.38.120,94.134.88.136} | 30 | 9 | "2019-10-16 22:16:22.163000" | {src4,src1,src2,src3} |
| {4,5} | {127.0.0.1,5.5.5.5} | 20 | 6 | "2019-10-16 22:16:22.163000" | {src1,src5,src3} |
| {6} | {1.1.0.9} | 10 | 3 | "2019-10-16 22:16:22.163000" | {src1,src2} |
问题:
如何制定SQL查询以获得预期结果
非常感谢
更多信息:
PostgreSQL 9.5.19使用分组运算符对地址进行分组我不知道这是否是最有效的方法,但我现在想不出更好的方法 我想这将有一个更大的表可怕的表现 将userlist作为 选择array_aggt.usr_id作为用户, a、 地址 从t_表t 左连接unnestt.address为true上的A地址 按地址分组 ,将_用户共享为 选择美国地址, 数组选择不同的ul.uid 从userlist u2中,unnestu2.users作为uluid 其中u.users和u2.users 以用户身份通过ul.uid订购 从用户列表u 选择用户、阵列和不同地址 来自共享用户 按用户分组; 它有什么作用 第一个收集至少共享一个地址的所有用户。userlist CTE的输出为: 用户地址 ---+------- {1} | 95.155.38.120 {1,3} | 94.134.88.136 {1,2} | 44.154.48.125 {6} | 1.1.0.9 {4,5} | 127.0.0.1 {1} | 81.134.82.111 {5} | 5.5.5.5 现在,这可以用来聚合那些共享至少一个地址的用户列表。共享用户CTE的输出为: 地址|用户 -------+---- 95.155.38.120 | {1,2,3} 94.134.88.136 | {1,2,3} 44.154.48.125 | {1,2,3} 1.1.0.9 | {6} 127.0.0.1 | {4,5} 81.134.82.111 | {1,2,3} 5.5.5.5 | {4,5} 正如您所看到的,我们现在有了具有相同usr_ID列表的组。在最后一步中,我们可以按这些地址分组并聚合地址,然后返回: 用户|数组|聚合 ----+----------------------------- {1,2,3} | {44.154.48.125,81.134.82.111,94.134.88.136,95.155.38.120} {4,5} | {127.0.0.1,5.5.5.5} {6} | {1.1.0.9}
您尝试过什么了吗?您可以拆分字符串,找到常见的IP,然后聚合查询并重新连接字符串,或者保留最长的字符串,而不是聚合…address[]似乎存储了一个IP地址列表。使用inet数据类型会更有效,因此inet[]a\u horse\u和a\u no\u name,请您看到以下内容:嗨,@a\u horse\u和a\u no\u name,请您帮助我:我已经尝试了一整天,无法更新您的查询以包括所有列。