如何在 Oracle SQL 中计算条件百分位数
How to compute a conditional percentile in Oracle SQL
我目前正在使用 Oracle SQL,我需要一种逻辑来从数据集中提取特定的基准值。
我有:
Article | Sales
1 | 5
2 | 0
3 | 2
4 | 9
........| ......
119 | 3
120 | 8
121 | 12
我需要:
我正在寻找前 5% 的文章,尤其是该系列中销量最差的一篇。为了继续我的分析,我需要现有列旁边那篇文章的销售额。
假设前 5% 的文章卖出了 9、12、14、14、17 和 19 次(其中 9 是前 5% 中最差的),table 需要看起来像这个:
Article | Sales | Benchmark
1 | 5 | 9
2 | 0 | 9
3 | 2 | 9
4 | 9 | 9
........| ......| ......
118 | 3 | 9
119 | 8 | 9
120 | 12 | 9
有什么关于我如何做到这一点的建议吗?
谢谢!
一种方法使用 percentile_cont()
或 percentile_disc()
。但是,我经常手动进行此类计算:
select t.*,
min(case when seqnum >= cnt * 19 / 20 then sales end) over () as benchmark
from (select t.*,
row_number() over (order by sales) as seqnum,
count(*) over () as cnt
from t
) t;
我目前正在使用 Oracle SQL,我需要一种逻辑来从数据集中提取特定的基准值。
我有:
Article | Sales
1 | 5
2 | 0
3 | 2
4 | 9
........| ......
119 | 3
120 | 8
121 | 12
我需要: 我正在寻找前 5% 的文章,尤其是该系列中销量最差的一篇。为了继续我的分析,我需要现有列旁边那篇文章的销售额。
假设前 5% 的文章卖出了 9、12、14、14、17 和 19 次(其中 9 是前 5% 中最差的),table 需要看起来像这个:
Article | Sales | Benchmark
1 | 5 | 9
2 | 0 | 9
3 | 2 | 9
4 | 9 | 9
........| ......| ......
118 | 3 | 9
119 | 8 | 9
120 | 12 | 9
有什么关于我如何做到这一点的建议吗? 谢谢!
一种方法使用 percentile_cont()
或 percentile_disc()
。但是,我经常手动进行此类计算:
select t.*,
min(case when seqnum >= cnt * 19 / 20 then sales end) over () as benchmark
from (select t.*,
row_number() over (order by sales) as seqnum,
count(*) over () as cnt
from t
) t;