我有一种情况,其中我使用下面的SQL Server NTILE函数将许多结果拆分为四分位数。目标是在每个类中具有相等数量的行
case NTILE(4) over (order by t2.TotalStd)
when 1 then 'A' when 2 then 'B' when 3 then 'C' else 'D' end as Class
结果表如下所示,并且在4个类别组A,B,C和D之间分配了(9,9,8,8)。
有两个结果引起我一个问题,两行的std值总计为30,但分配给不同的四分位数。
8 30 A
2 30 B
我想知道是否有办法确保将具有相同值的行分配给相同的四分位数?我可以按另一列分组或分区以获取此行为吗?
Pos TotalStd class
1 16 A
2 23 A
3 21 A
4 29 A
5 25 A
6 26 A
7 28 A
8 30 A
9 29 A
1 31 B
2 30 B
3 32 B
4 32 B
5 34 B
6 32 B
7 34 B
8 32 B
9 33 B
1 36 C
2 35 C
3 35 C
4 35 C
5 40 C
6 38 C
7 41 C
8 43 C
1 43 D
2 48 D
3 45 D
4 47 D
5 44 D
6 48 D
7 46 D
8 57 D
最佳答案
您将需要使用rank函数重新创建Ntile函数。
等级函数对具有相同值的行给出相同的等级。稍后,该值将“跳转”到下一个等级,就好像您使用row_number一样。
我们可以使用此行为来模仿Ntile函数,强制它向具有相同值的行赋予相同的Ntile值。但是,这将导致Ntile分区的大小不同。
请参阅以下示例,了解使用4个回收箱的新Ntile:
declare @data table ( x int )
insert @data values
(1),(2),
(2),(3),
(3),(4),
(4),(5)
select
x,
1+(rank() over (order by x)-1) * 4 / count(1) over (partition by (select 1)) as new_ntile
from @data
结果:
x new_ntile
---------------
1 1
2 1
2 1
3 2
3 2
4 3
4 3
5 4
关于sql-server - SQL Server NTILE-在不同的四分位数中具有相同的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9331529/