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,请您帮助我:我已经尝试了一整天,无法更新您的查询以包括所有列。