【发布时间】:2015-02-25 21:19:10
【问题描述】:
查询的输入值:1-20 数据库中的值:4,5, 15,16
我想要一个查询结果如下
Value - Count
===== - =====
1 - 3
6 - 9
17 - 3
所以基本上,首先生成从 1 到 20 的连续数字,计算可用数字。 我写了一个查询,但我不能让它完全工作:
with avail_ip as (
SELECT (0) + LEVEL AS val
FROM DUAL
CONNECT BY LEVEL < 20),
grouped_tab as (
select val,lead(val,1,0) over (order by val) next_val
from avail_ip u
where not exists (
select 'x' from (select 4 val from dual) b
where b.val=u.val) )
select
val,next_val-val difference,
count(*) over (partition by next_val-val) avail_count
from grouped_tab
order by 1
它给了我计数,但我不确定如何将行压缩为三行。
我无法添加完整的查询,我不断收到“提交时出错”。由于某种原因,它不喜欢联合条款。所以我将查询附加为图像:(
具体要求的更多细节:
我正在编写一个 ip 管理模块,我需要在一个 ip 块中找出可用(免费)的 ip 地址。块可以是 /16 或 /24 甚至 /12。为了使它更具挑战性,我还支持 IPv6,因此将有更多的数字需要管理。所有发布的 IP 地址都以十进制格式存储。所以我的想法是首先生成从网络地址到广播地址的块范围内的所有ip小数。例如。在 /24 中,将有 255 个地址,在 /16 中将有 64K。
现在,其次查找块内所有已使用的地址,并找出具有起始ip的可用地址数。所以在上面的例子中,起始1个ip-3个地址可用,起始6个,9个可用。
我最后担心的是查询应该能够以足够快的速度运行以遍历数百万个数字。
再次抱歉,如果我最初的问题不够清楚。
【问题讨论】:
标签: oracle11g