我有一张表,其中包括月份,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
答案 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;