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  
所以,如果我做了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
这是输出,因为行数不均匀,所以存储桶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个桶的用途
Adi*_*iti 18
它将按标记的降序排列数据,然后将其拆分为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  
小智 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是可选的.
| 归档时间: | 
 | 
| 查看次数: | 63001 次 | 
| 最近记录: |