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

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是可选的.