我们有一个包含数百万条目的表。该表有两列,现在X和Y之间存在相关性,当X超出一个值时,Y趋向于B(但并不总是如此,它是一种趋势不确定)。
这里我想找到 X 的阈值,即 (X1) 使得至少 99% 的小于 X1 的值是 B。
这可以很容易地使用代码来完成。但是有没有可以进行计算的 SQL 查询。
对于以下数据集,预期为 6,因为低于 6 时,超过 99% 是“B”,并且没有更大的 X 值,其中超过 99% 是“B”。但是,如果我将其更改为 90% 的精度,那么它将变为 12,因为如果 X<12,超过 90% 的值是“B”,并且没有更大的 X 值适用
因此我们需要找到最大的值 X1,使得小于 X1 的值中至少有 99% 是“B”。
X Y
------
2 B
3 B
3 B
4 B
5 B
5 B
5 B
6 G
7 B
7 B
7 B
8 B
8 B
8 B
12 G
12 G
12 G
12 G
12 G
12 G
12 G
12 G
13 G
13 G
13 B
13 G
13 G
13 G
13 G
13 G
14 B
14 G
14 G
最佳答案
好的,我认为这可以完成您想做的事情,但它不对您提到的数据量有效。无论如何我都会发布它,以防它可以帮助其他人提供答案。
这可能是其中一种最有效的方法是对已排序数据使用游标。 Oracle 有一些用于相关分析的构建函数,但我从未使用过它,所以我不知道它们是如何工作的。
select max(x)
from (select x
,y
,num_less
,num_b
,num_b / nullif(num_less,0) as percent_b
from (select x
,y
,(select count(*) from table b where b.x<a.x) as num_less
,(select count(*) from table b where b.x<a.x and b.y = 'B') as num_b
from table a
)
where num_b / nullif(num_less,0) >= 0.99
);
内部选择执行以下操作:
对于 X 的每个值
- 计算值的个数 < X
- 计算'B'的数量
下一个 SELECT 计算 B 的比率并仅过滤比率高于阈值的行。外部只是从那些剩余的行中选择 max(x)。
编辑: 上述查询中不可扩展的部分是半笛卡尔自连接。
关于sql - 计算精度为 99% 的数据点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21306459/