sql - 计算精度为 99% 的数据点

标签 sql oracle aggregate-functions precision percentile

我们有一个包含数百万条目的表。该表有两列,现在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/

相关文章:

mysql - 如何只获取具有多个值的出现?

arrays - 两个嵌套表集合之间的plsql差异

sql - 根据另一个字段的代码聚合一个字段中的多个值

asp.net - 如何在sql语句中使用传递给asp.net webservice的参数?

python - 使用 qmark 样式参数时解决 SQL 类型名称错误?

java - 使用 '%' 作为 Java 中 SQL 参数中的通配符

sql - Oracle 日期减法

sql - 根据条件聚合文本

arrays - 如何按位置对 postgresql 数组的元素求和?

mysql - 多行到一列