Как вычислить условный процентиль в 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%), таблица должна выглядеть следующим образом:

Article | Sales | Benchmark
1       | 5     | 9
2       | 0     | 9
3       | 2     | 9
4       | 9     | 9
........| ......| ......
118     | 3     | 9
119     | 8     | 9
120     | 12    | 9

Какие-нибудь советы о том, как я могу это сделать?
Спасибо!

1 ответ

  1. Один метод использует percentile_cont()or 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;