我有一种情况,其中我使用下面的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/

10-11 06:33