如何克服 `PERCENTILE_CONT` 的参数应该是常量的限制?

Posted

技术标签:

【中文标题】如何克服 `PERCENTILE_CONT` 的参数应该是常量的限制?【英文标题】:How to overcome the limitation of `PERCENTILE_CONT` that the argument should be constant? 【发布时间】:2015-07-29 11:51:12 【问题描述】:

我想找到将输入集 ADS.PREDICTOR 分成同样大的组的 POINTCOUNT 值。参数POINTCOUNT 对于不同的预测变量可以有不同的值,所以我不想在代码中硬编码它。

不幸的是,下面的代码因ORA-30496: Argument should be a constant 而失败...我该如何克服这个问题(当然,除了带有硬编码阈值分位数的 300 行代码)?

define POINTCOUNT=300;
select
    *
from (
select
    percentile_disc(MYQUNTILE)
        within group (
            order by PREDICTOR ) as THRESHOLD
from ADS
inner join (
    select (LEVEL - 1)/(&POINTCOUNT-1) as MYQUANTILE
    from dual
    connect by LEVEL <= &POINTCOUNT
    )
on 1=1
)
group by THRESHOLD

我想画一条 ROC 曲线。该曲线将在 Excel 中绘制为 Oracle 中计算的点对 (X, Y) 之间的线性插值。

使用阈值计算每个点 (X, Y)。

如果每个相邻的 (X, Y) 对之间的距离是均匀的,我将获得给定数量的点对的 ROC 曲线的最佳近似值。

如果我将预测值的域切割成 N 个值,分隔第 1/N 个分位数,我应该得到一组相当好的阈值。

【问题讨论】:

这对于一些 plsql 和动态 ddl 是可行的,但我手头没有时间来写它。只需使用带有 execute_immediate 的 percentile_disc 拍摄选择,然后在集合或表格中捕获结果。 【参考方案1】:

PERCENTILE_CONT() 只要求百分位值在每个组 中保持不变。您的子查询中没有group by,所以我认为这可能会解决您的问题:

select MYQUANTILE,
       percentile_disc(MYQUANTILE) within group (order by PREDICTOR
                                                ) as THRESHOLD
from ADS cross join
     (select (LEVEL - 1)/(&POINTCOUNT-1) as MYQUANTILE
      from dual
      connect by LEVEL <= &POINTCOUNT
     )
GROUP BY MYQUANTILE;

另外,请注意CROSS JOININNER JOIN . . . ON 1=1 相同。

【讨论】:

以上是关于如何克服 `PERCENTILE_CONT` 的参数应该是常量的限制?的主要内容,如果未能解决你的问题,请参考以下文章

SQL percentile_cont vs SPSS 频率百分位数

红移中的 PERCENTILE_CONT()

Percentile_Cont 函数抛出错误

BigQuery:标准 SQL 和 PERCENTILE_CONT() 函数

sql server 2008 中 percentile_cont 的替代方案

在 Vertica 中创建 percentile_cont 作为聚合函数