SQL-对每月数据集进行排名,高,中,低

时间:2018-09-28 08:58:49

标签: sql sql-server case rank percentile

我有一张表,其中包括月份,accountID和一组应用程序分数。我想创建一个新列,每个月对结果的顶部,中间和底部33%给出“高”,“中”或“低”。

如果我使用rank(),我可以订购一个月或整个数据集的应用程序分数,但是我不确定如何每月订购。另外,在我的SQL Server版本上,percent_rank()不起作用。

select 
    AccountID
,   ApplicationScore
,   rank() over (order by applicationscore asc) as Rank
from Table

然后,我知道我需要将rank()语句放入子查询中,然后使用case语句来应用“高”,“中”或“低”。

select 
    AccountID
,   case when rank <= total/3 then 'low'
         when rank > total/3 and rank <= (total/3)*2 then 'medium'
         when rank > (total/3)*2 then 'high' end ApplicationScore 
from (subquery) a 

2 个答案:

答案 0 :(得分:1)

Ntile(3)效果很好

select 
    AccountID
,   Monthstart
,   ApplicationScore
,   ntile(3) over (partition by monthstart order by applicationscore) Rank  
from table

答案 1 :(得分:0)

SQL Server可能内置了一些东西来处理您的问题。但是我们可以轻松地使用计数比率来找到每个月的分数的三个部分。我们可以使用的比率是计数,按月划分,按分数排序,再除以整个月的计数。

WITH cte AS (
    SELECT *,
        1.0 * COUNT(*) OVER (PARTITION BY Month ORDER BY ApplicationScore) /
            COUNT(*) OVER (PARTITION BY Month) AS cnt
    FROM yourTable
)

SELECT
    AccountID,
    Month,
    ApplicationScore,
    CASE WHEN cnt < 0.34 THEN 'low'
         WHEN cnt < 0.67 THEN 'medium'
         ELSE 'high' END AS rank
FROM cte
ORDER BY
    Month,
    ApplicationScore DESC;

Demo