想了解更多关于NTILE()(Want to learn more on NTILE())

2019-07-18 06:42发布

I was reading on RANKING function for ms sql. I understand the others function except NTILE(). Lets say if i have this data:

   StudentID     MARKS  
      S1           75  
      S2           83
      S3           91
      S4           83
      S5           93  

So if i do a NTILE(2) OVER(ORDER BY MARKS desc) what will be the result and why?
And what if it is a NTILE(3)? Simple explaination anyone?

Answer 1:

把它看作桶,NTILE(2)将2桶,半行的值将为1,而另一半的值2

create table  #temp(StudentID char(2),    Marks  int) 
insert #temp  values('S1',75 ) 
insert #temp  values('S2',83)
insert #temp  values('S3',91)
insert #temp  values('S4',83)
insert #temp  values('S5',93 ) 


select NTILE(2) over(order by Marks),*
from #temp
order by Marks

下面是输出的,因为你有一个奇数行,斗1将有1行更多

1   S1  75
1   S2  83
1   S4  83
2   S3  91
2   S5  93

如果添加多一个排

insert #temp  values('S6',92 ) 

现在,这两个桶有3行

1   S1  75
1   S2  83
1   S4  83
2   S3  91
2   S6  92
2   S5  93

在现实中,我从来没有使用NTILE在生产代码,但我可以看到使用,你需要分割的结果转换成桶的n个



Answer 2:

它将安排降序标记的顺序的数据,然后将其分成2组。

如果数据不能被分成相等的组,则第一几组将具有比后者组的更多的行。

所以NTILE(2)会给你

StudentID       MARKS       NTILE  
      S5           93           1 
      S3           91           1 
      S2           83           1
      S4           83           2
      S1           75           2 

同样NTILE(3)会给你

StudentID       MARKS       NTILE  
      S5           93           1 
      S3           91           1 
      S2           83           2
      S4           83           2
      S1           75           3  


Answer 3:

我用NTILE相当频繁,以电子邮件列表拆分成桶的10/10/80测试。 例如,我们正在测试的电子邮件的主题行,并要设置两个选项之一发送到每个列表中的10%,被发送到剩下的80%执行更好的一个。

SELECT [字段列表],(NTILE(10)OVER(由newid的顺序())) - 1 AS段FROM [数据]

“订单由NEWID()”保证了随机顺序。 在“[NTILE ...] - 1”的语法是一些我们使用做文本分析,而不是整数运算的其他工具的直接结果,所以它更容易有结果从0-9,而不是1-10运行。 段场将与0-9,我可以用它来很容易分离出来的记录,10%的值来填充,并且不止一次与多努力,他们的广告活动。

如果您需要复制的结果的查询,则需要“按订单”的条款使用的东西在确定性,或添加一列使用GUID来使用order by子句。

的PARTITION BY子句将用于基于状态,或职业,或一些其它预定的分组,即NTILE(10)OVER(PARTITION BY国家ORDER BY NEWID())或一些这样的建立值区的组。 我相信ORDER BY子句是必需的 - 该PARTITION BY是可选的。



Answer 4:

在NTILE函数首先它计数的行数,并通过在NTILE通过paramenter划分,然后使行的等于组根据商数和排名,然后剩余的行将由每个组中的换档方式分布从顶部并且不会把它从,例如,如果组1有4行,那么它只要5排,其组不是最后一排的至少行。

谢谢



Answer 5:

NTILE不使用分区子句,只是划分基于NTILE(数)的数目数据集,使得:如果没有行的是7,例如:1,1,1,2,3,4,5 NTILE(3)将给3,2,2。 我怎么3,2,2? 首先假设7 6(少了一个,使其更)6/3给出了2,2,2,然后加+! 到第一个分区。 如果节数行甚至那就没问题。 只是划分数据集

NTILE使用分区子句,只是划分基于在数据集中的值数据集,使得:如果没有行的是7,与实施例排值是:1,1,1,2,3,4,5然后:NTILE(3)之间分配按值将给:1,2,3,1,1,1,1。 我是怎样得到这个? 首先打破基于值数据集:在这里,1,1,1是一个partiton,接下来的所有值形成不同的分区。 然后开始给每个分区分配NTILE排名。 在这里,1,1,1将成为1,2,3然后用一个分区继续,你可以拉排名只在钱柜指定NTILE数()函数



文章来源: Want to learn more on NTILE()