【问题标题】:SQL - Rank monthly dataset high, medium, lowSQL - 将每月数据集排名高、中、低
【发布时间】:2018-09-28 08:58:49
【问题描述】:

我有一个表格,其中包括月份、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 

【问题讨论】:

  • 您的预期输出是什么?想要每个月内的排名,还是整个数据集的排名?
  • @TimBiegeleisen 我希望我的表显示月份、帐户 ID、应用程序分数、排名。排名实际上是 MonthlyRank,它给出“低”、“中”或“高”排名,具体取决于它是在该月结果的前三分之一、中还是后三分之一

标签: sql sql-server case rank percentile


【解决方案1】:

Ntile(3) 效果很好

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

【讨论】:

    【解决方案2】:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-27
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多