Как использовать процентиль и ранг, чтобы получить среднее количество дней для 90 процентов заказов

У меня есть таблица с именем order, и в ней есть 3 интересующих меня столбца: order ID, day order placed, day fulfilled. order ID уникален.

Мне нужно узнать, за сколько дней (в среднем) было оплачено 90% заказов, размещенных в январе 2016 года.

Если заказ 1 был выполнен за 1 день, заказ 2 за 2 дня, заказ 3 за 3 дня... заказ 10 за 10 дней, то мне нужно было бы рассчитать как таковой:

  • количество заказов = 10
  • 90% of 10 = 9
  • на выполнение первых 9 из этих 10 заказов, расположенных в порядке возрастания, ушло: 1+2+3+4+5+6+7+8+9 = 45 дней на выполнение
  • следовательно, средний день для первых 90% выполненных заказов: 45/9 = 5 дней.

Как я могу написать запрос, чтобы сначала упорядочить заказы по «количеству дней для выполнения», а затем рассчитать среднее количество дней, которое потребовалось для первых 90% заказов за этот период?

введите здесь описание изображения


person sql newb    schedule 25.02.2016    source источник


Ответы (1)


Во-первых, мы должны были бы предположить, что большая часть заказов была выполнена с января.

Во-вторых, вы можете сделать это с помощью аналитических функций. Хотя процентные функции работают, я обычно делаю это по старинке. . . с помощью row_number() и count(*):

select min(days)
from (select (coalesce(datefulfilled, trunc(sysdate)) - dateordered) as days,
             sum(count(*) over (order by  (coalesce(datefulfilled, trunc(sysdate)) - dateordered)) as cumecnt,
             sum(count(*)) over () as totalcnt
      from orders o
      group by  (coalesce(datefulfilled, trunc(sysdate)) - dateordered)
     ) d
where cumecnt >= 0.9 * cnt ;
person Gordon Linoff    schedule 25.02.2016