我有经典的表格范围:
Range1 - 1 - 3.99 Range2 - 4 - 6.99 Range3 - 7 - 10
是否有任何着名的SQL,内置的Oracle函数,任何东西......检查它们是相关的,相邻的还是下一个接一个的?
在上面的示例中,验证是真的。
所以,3.99 + 0.01 = 4
,它是正确的
如果Range1
的结尾为3.72
或range2
的结尾为4.12
,那就错了。
不允许使用Pi等非理性数字或超过两位小数的值。
谢谢。此致
答案 0 :(得分:2)
假设您的范围不重叠,您可以使用LAG()窗口函数:
with v_data as (
select 'Range1' name, 1 low, 3.99 high from dual union all
select 'Range2' name, 4 low, 6.99 high from dual union all
select 'Range3' name, 7 low, 10 high from dual
)
select
v1.*,
lag(high) over (partition by 1 order by high) as prev_high ,
low - lag(high) over (partition by 1 order by high) as diff
from v_data v1
这会将差异返回到“diff”列中的前一个范围;如果你把它放在另一个查询中并通过diff>过滤0.01,如果你的范围足够接近,这将返回0行。
答案 1 :(得分:1)
鉴于在有效数据集中,每个范围的一个组件仅在其与集合中另一个值的比较的基础上被定义为正确,它具有冗余数据元素。
您可以通过仅指定较低或较高的边界值来更健壮地定义数据集,并避免数据无效的可能性。
出于显示目的,您可以使用Lag()或Lead()窗口函数轻松地重建范围。