如何根据计算获得百分位排名

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),那么更难的部分是joins。我认为这是百分位数排名所需的基本数据:

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 函数的用法不明白..能解释一下吗?

以上是关于如何根据计算获得百分位排名的主要内容,如果未能解决你的问题,请参考以下文章

计算相对于给定总体的百分位排名

使用 MySQL 计算百分比值

获得滚动百分位数排名的快速方法

百分位,百分位数(percentile)

在 OBIEE 中使用计算项目时如何获得正确的百分比值?

如何计算学生在 >25th 百分位 <75th 百分位之间的分数,按照分数的递增顺序。使用下面的函数