如何在 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;