想要了解更多关于NTILE()的信息

时间:2013-01-16 09:43:11

标签: sql sql-server sql-server-2008 tsql

我正在阅读ms sql的RANKING函数。我理解除NTILE()之外的其他功能。 让我们说如果我有这个数据:

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

所以,如果我做NTILE(2) OVER(ORDER BY MARKS desc)结果会是什么?为什么? 如果它是NTILE(3)怎么办? 简单解释任何人?

5 个答案:

答案 0 :(得分:38)

将其视为桶,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个桶的用途

答案 1 :(得分:18)

它将按标记的降序排列数据,然后将其分成两组。

如果数据无法拆分为相同的组,则前几组的行数将多于后一组。

所以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  

答案 2 :(得分:6)

我经常使用NTILE将电子邮件列表拆分成适用于10/10/80测试的存储桶。例如,我们正在测试电子邮件的主题行,并希望将两个选项中的一个发送到列表中的每个10%,其中表现更好的选项将被发送到剩余的80%。

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

“newid()的顺序”确保了随机顺序。 “[NTILE ...] - 1”语法是我们使用的一些其他工具的直接结果,它们使用文本解析而不是整数数学,因此更容易使结果从0-9而不是1-10运行。段字段将填充0-9中的值,我可以使用该值轻松地分离出10%的记录,而对于多次努力的广告系列则不止一次。

如果您需要具有可复制结果的查询,则需要在“order by”子句中使用确定性的内容,或者添加具有GUID的列以用于order by子句。

PARTITION BY子句将用于根据状态,专业或某些其他预定分组创建存储桶组,即NTILE(10)OVER(PARTITION BY State ORDER BY newid())或某些类别。我相信ORDER BY子句是必需的 - PARTITION BY是可选的。

答案 3 :(得分:0)

在Ntile函数中,首先计算行数并将其除以ntile中传递的参数,然后根据商进行相等的行组并对它们进行排序,然后剩余的行将由每个组从顶部分配到一种移动的方式,并且不会从最少的行中获取它,例如,如果group1有4行,那么它将在其组中的第5行而不是最后一行。

由于

答案 4 :(得分:0)

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,然后加+!到第一个分区。如果no.of甚至没有问题。只是划分数据集

Ntile使用分区子句,只需根据数据集中的值划分数据集,使得:如果没有行为7,则示例行值为:1,1,1,2,3,4,5则:ntile( 3)按值划分将给出:1,2,3,1,1,1,1。我是怎么得到这个的?首先根据值打破数据集:这里,1,1,1是一个分区,然后所有值形成一个不同的分区。然后开始为每个分区分配ntile排名。这里,1,1,1将成为1,2,3然后继续下一个分区,你可以只将等级拉到ntile()函数中指定的数字