Как получить ранг процентиля на основе вычисления

#sql #oracle

#sql #Oracle

Вопрос:

существует четыре таблицы в виде :

  1. T_SALES имеет столбцы типа

     CUST_KEY,
    ITEM_KEY,
    SALE_DATE,
    SALES_DLR_SALES_QTY,
    ORDER_QTY.
      
  2. T_CUST имеет столбцы типа

     CUST_KEY,
    CUST_NUM,
    PEER_GRP_ID
      
  3. T_PEER_GRP имеет столбцы типа

     PEER_GRP_ID,
    PEER_GRP_DESC,
    PRNT_PEER_GRP_ID
      
  4. T_PRNT_PEEER имеет столбцы типа

     PRNT_PEER_GRP_ID,
    PRNT_PEER_DESC
      

Теперь для приведенных выше таблиц мне нужно сгенерировать процентильный ранг клиента на основе вычислений fillrate = SALES_QTY / ORDER_QTY * 100 группой одноранговых узлов в родительском узле.

может кто-нибудь, пожалуйста, помочь в этом?

Комментарии:

1. Какую базу данных вы используете. У разных есть разные вспомогательные методы, помогающие с подобными вещами?

Ответ №1:

Вы можете использовать аналитическую функцию PERCENT_RANK() для вычисления ранга процентиля, как показано ниже:

 SELECT
    t_s.cust_key,
    t_c.cust_num,
    PERCENT_RANK() OVER (ORDER BY (t_s.SALES_DLR_SALES_QTY / ORDER_QTY) DESC) as pr
FROM t_sales t_s
INNER JOIN t_cust t_c ON t_s.cust_key = t_c.cust_key
ORDER BY pr;
  

Ссылка:

PERCENT_RANK по ссылке Oracle® Database SQL

Ответ №2:

Если под «процентильным рангом» вы подразумеваете «процентный ранг» (задокументировано здесь), то самая сложная часть — это join s. Я думаю, что это основные данные, которые вы хотите для ранга процентиля:

 select t.PEER_GRP_ID, t.PRNT_PEER_GRP_ID,
       sum(SALES_DLR_SALES_QTY * ORDER_QTY) as total
from t_sales s join
     t_customers c
     on s.CUST_KEY = c.cust_key join
     t_peer_grp t
     on t.PEER_GRP_ID = c.PEER_GRP_ID
group by  t.PEER_GRP_ID, t.PRNT_PEER_GRP_ID;
  

Затем вы можете вычислить процентиль (от 0 до 100) как:

 select t.PEER_GRP_ID, t.PRNT_PEER_GRP_ID,
       sum(SALES_DLR_SALES_QTY * ORDER_QTY) as total,
       percentile_rank() over (partition by  t.PRNT_PEER_GRP_ID
                               order by sum(SALES_DLR_SALES_QTY * ORDER_QTY)
                              )
from t_sales s join
     t_customers c
     on s.CUST_KEY = c.cust_key join
     t_peer_grp t
     on t.PEER_GRP_ID = c.PEER_GRP_ID
group by t.PEER_GRP_ID, t.PRNT_PEER_GRP_ID;
  

Обратите внимание, что это смешивает аналитические функции с функциями агрегирования. Это может показаться неудобным, когда вы впервые узнаете об этом.

Комментарии:

1. спасибо за запрос linoff, но я не понял, как здесь используется функция if sum .. не могли бы вы объяснить, пожалуйста?