我正在阅读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)
怎么办?
简单解释任何人?
答案 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()函数中指定的数字