2017-01-14 4 views
0

В настоящее время я работаю с 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 

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

ответ

0

Один метод использует 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; 
+0

Удивительно, работает как шарм. Благодаря! – Berbatov

+0

Зачем это делать вручную, а не с 'percentile_disc()'? Вы обнаружили, что он ведет себя неправильно? В противном случае это, безусловно, будет более эффективным и легким для чтения и обслуживания. И он должен быть включен в ответ вместе с ручным вычислением. – mathguy

Смежные вопросы