如何克服 `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 JOIN
与INNER JOIN . . . ON 1=1
相同。
【讨论】:
以上是关于如何克服 `PERCENTILE_CONT` 的参数应该是常量的限制?的主要内容,如果未能解决你的问题,请参考以下文章
SQL percentile_cont vs SPSS 频率百分位数
BigQuery:标准 SQL 和 PERCENTILE_CONT() 函数