您的位置:首页 > 数据库

Sql分数前7名的成绩之(偶遇with ties)

2010-03-30 08:55 176 查看
今天在园子里看了关于索引的一道经典面试题,讲了这样一个问题“从100万条记录中的得到成绩最高的记录”。看到这个题目,通常我们的做法是:

selecttop1*fromstudentorderbyscoredesc

[/code]
但是这样做你会发现,如果有几个人分数并列第一,这样就只能取到一个记录。用下面的代码的话,就可以正确地取出分数第一的所有记录:

selecttop1withties*fromstudentorderbyscoredesc

[/code]
由于以前没有用过withties,看到这个比较新奇,故随后MSDN,Google,Baidu之。



WITHTIES

指定从基本结果集中返回额外的行,对于ORDERBY列中指定的排序方式参数,这些额外的返回行的该参数值与TOPn(PERCENT)行中的最后一行的该参数值相同。只能在SELECT语句中且只有在指定了ORDERBY子句之后,才能指定TOP...WITHTIES。

注意:返回的记录关联顺序是任意的。ORDERBY不影响此规则

来源:MSDN,http://msdn.microsoft.com/zh-cn/library/ms189463.aspx


MSDN中指出这些额外的返回行的参数值与TOPn(PERCENT)行中的最后一行的该参数值相同。这个地方该怎么理解呢?其实是如果按照orderby参数排序TOPn(PERCENT)返回了前面n(pencent)个记录,但是n+1…n+k条记录和排序后的第n条记录的参数值(orderby后面的参数)相同,则n+1、…、n+k也返回。n+1、…、n+k就是额外的返回值。

举个例子,假设有如下记录:

studentIDcourseNamescore
09212744数据库90
09212745数据库90
09212746数据库90
09212750数据库85
09212719数据库84
09212720数据库80
09212742数据库80
09212751数据库75
09212755数据库74
09212740数据库70

selecttop6*fromstudentorderbyscoredesc

将返回如下结果:





图1不带withties(注意最好一条记录)


selecttop6withties*fromstudentorderbyscoredesc

[/code]
将返回如下结果:





图2带withties(多了第7条记录)

结果一目了然,不用多解释!

插曲:其实在这个过程中有个小插曲,我首先是Google“withties”搜到了这篇文章WithTiesonSQLServer2005。内容如下(翻译之后):

SQLServer2005有一个功能来选择top记录,但是我要说的是,我希望同样的数量将被加载。举例来说,我想从表中记录选择前5名的货币汇率,但是如果其中一个记录有相同的值,不要让算作前5名。通过下面的例子来证明。

[align=left]selecttop5*frombatchwheremodule=‘CA’orderbycuryratedesc[/align]

BatNbrCuryRate
0003459900
0003509900
0003519900
0004009800
0004509750

如果你看结果,你会看到9900被加载了3次,让我们看看如果运行下面的脚步。

selecttop5withties*frombatchwheremodule=‘CA’orderbyCuryRatedesc

BatNbrCuryRate
0003459900
0003509900
0003519900
0004009800
0004509750
0004519750
0004759500
0004569400

这就是WithTiesonSQLServer2005的全部内容,这导致我对withties理解错误!认为加上withties后,会返回除了重复的记录会返回n条记录,还一直认为是MSDN解释错了(⊙﹏⊙b汗)。而且这篇文章被许多人装载了,博客园和csdn都要,不知道我对那片文章理解错了还是他本来就错了。如果是我理解错了,请告诉我,谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
章节导航