Sql 如何使用;分组方式;通过IP对数据进行分组
如何使用Sql 如何使用;分组方式;通过IP对数据进行分组,sql,postgresql,ip-address,aggregation,Sql,Postgresql,Ip Address,Aggregation,如何使用groupby在postgres中按IP范围分组数据 我的桌子: "NETADDR" | ----------------| 192.168.13.6 | 192.168.13.6 | 192.168.14.5 | 192.168.14.6 | "NETADDR" | "COUNT" ----------------|----------------| 192.168.13 | 2 192.168.14
groupby
在postgres中按IP范围分组数据
我的桌子:
"NETADDR" |
----------------|
192.168.13.6 |
192.168.13.6 |
192.168.14.5 |
192.168.14.6 |
"NETADDR" | "COUNT"
----------------|----------------|
192.168.13 | 2
192.168.14 | 2
所需输出:
"NETADDR" |
----------------|
192.168.13.6 |
192.168.13.6 |
192.168.14.5 |
192.168.14.6 |
"NETADDR" | "COUNT"
----------------|----------------|
192.168.13 | 2
192.168.14 | 2
我不确定
cidr
是否会使这项工作更有效率,因为您仍然需要进行聚合。可以使用数组函数构造类型C地址:
select array_to_string((regexp_split_to_array(netaddr, '\.'))[1:3], '.') as typec,
count(*)
from t
group by typec;
或使用正则表达式:
select regexp_replace(netaddr, '(^[0-9]+[.][0-9]+[.]+[0-9]).*$', '\1') as typec,
count(*)
from t
group by typec
。以字符串形式存储和处理IP地址会使此过程和其他过程变得缓慢、困难和迟钝
相反,将它们存储为,并使用它们的/24对地址进行分组
select
set_masklen(netaddr, 24) as subnet,
count(*)
from mytable
group by subnet
虽然它可能对这个特定的查询没有好处,cidr
可以使用with进行索引,以便对其他查询有所帮助
create index on mytable using gist(netaddr inet_ops);
如果不能更改列类型,则仍然可以使用cidr函数进行转换
set\u masklen(netaddr::cidr,24)
什么类型是netaddr
?请考虑使用哪种类型。这将使这更容易和更有效。