10e*_*e5x 37 sql t-sql sql-server sql-server-2008
我正在阅读ms sql的RANKING函数.我理解除NTILE()之外的其他功能.让我们说如果我有这些数据:
StudentID MARKS
S1 75
S2 83
S3 91
S4 83
S5 93
Run Code Online (Sandbox Code Playgroud)
所以,如果我做了NTILE(2) OVER(ORDER BY MARKS desc)什么将是结果,为什么?
如果它是一个NTILE(3)怎么办?简单解释任何人?
SQL*_*ace 40
把它想象成桶,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
Run Code Online (Sandbox Code Playgroud)
这是输出,因为行数不均匀,所以存储桶1将有1行
1 S1 75
1 S2 83
1 S4 83
2 S3 91
2 S5 93
Run Code Online (Sandbox Code Playgroud)
如果再添加一行
insert #temp values('S6',92 )
Run Code Online (Sandbox Code Playgroud)
现在两个桶都有3行
1 S1 75
1 S2 83
1 S4 83
2 S3 91
2 S6 92
2 S5 93
Run Code Online (Sandbox Code Playgroud)
实际上我从来没有在生产代码中使用过NTILE,但我可以看到你需要将结果分成n个桶的用途
Adi*_*iti 18
它将按标记的降序排列数据,然后将其拆分为2组.
如果数据无法拆分为相等的组,则前几组将具有比后一组更多的行.
所以NTILE(2)会给你
StudentID MARKS NTILE
S5 93 1
S3 91 1
S2 83 1
S4 83 2
S1 75 2
Run Code Online (Sandbox Code Playgroud)
同样NTILE(3)会给你
StudentID MARKS NTILE
S5 93 1
S3 91 1
S2 83 2
S4 83 2
S1 75 3
Run Code Online (Sandbox Code Playgroud)
小智 7
我经常使用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(按状态分区ORDER BY newid())或某些类别.我相信ORDER BY子句是必需的 - PARTITION BY是可选的.