如何克服“PERCENTILE_CONT”的限制,即参数应该是常数?

时间:2015-07-29 11:51:12

标签: sql oracle

我想找到将输入集POINTCOUNT剪切成同样大的组的ADS.PREDICTOR值。参数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曲线的最佳近似值。

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

1 个答案:

答案 0 :(得分:0)

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相同。