如何根据计算获得百分位排名
Posted
技术标签:
【中文标题】如何根据计算获得百分位排名【英文标题】:How to get a percentile rank based on a computation 【发布时间】:2014-07-02 11:23:42 【问题描述】:有四个表:
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】:您可以使用解析函数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 on Oracle® Database SQL Reference
【讨论】:
【参考方案2】:如果“百分比排名”是指“百分比排名”(记录在here),那么更难的部分是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;
请注意,这会将分析函数与聚合函数混合在一起。当您第一次了解它时,这可能看起来很尴尬。
【讨论】:
感谢 linoff 的查询,但是这里的 sum 函数的用法不明白..能解释一下吗?以上是关于如何根据计算获得百分位排名的主要内容,如果未能解决你的问题,请参考以下文章