#sql #oracle
#sql #Oracle
Вопрос:
существует четыре таблицы в виде :
-
T_SALES
имеет столбцы типаCUST_KEY, ITEM_KEY, SALE_DATE, SALES_DLR_SALES_QTY, ORDER_QTY.
-
T_CUST
имеет столбцы типаCUST_KEY, CUST_NUM, PEER_GRP_ID
-
T_PEER_GRP
имеет столбцы типаPEER_GRP_ID, PEER_GRP_DESC, PRNT_PEER_GRP_ID
-
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;
Ссылка:
Ответ №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 .. не могли бы вы объяснить, пожалуйста?