gpt4 book ai didi

sql-server - SQL Server NTILE - 不同四分位中的相同值

转载 作者:行者123 更新时间:2023-12-03 02:47:54 26 4
gpt4 key购买 nike

我有一个场景,我使用下面的 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

结果表如下所示,A、B、C 和 D 4 个类(class)组之间的划分为 (9,9,8,8)。

有两个结果导致我出现问题,两行的总标准值相同,均为 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

最佳答案

您将需要使用排名函数重新创建 Ntile 函数。排名函数对具有相同值的行给出相同的排名。该值稍后会“跳”到下一个排名,就像您使用 row_number 一样。我们可以使用此行为来模仿 Ntile 函数,强制它为具有相同值的行提供相同的 Ntile 值。然而 - 这将导致 Ntile 分区具有不同的大小。请参阅下面的示例,了解使用 4 个 bin 的新 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com