Sql分数前7名的成绩之(偶遇with ties)
2010-03-30 08:55
176 查看
今天在园子里看了关于索引的一道经典面试题,讲了这样一个问题“从100万条记录中的得到成绩最高的记录”。看到这个题目,通常我们的做法是:
[/code]
但是这样做你会发现,如果有几个人分数并列第一,这样就只能取到一个记录。用下面的代码的话,就可以正确地取出分数第一的所有记录:
[/code]
由于以前没有用过withties,看到这个比较新奇,故随后MSDN,Google,Baidu之。
WITHTIES
指定从基本结果集中返回额外的行,对于ORDERBY列中指定的排序方式参数,这些额外的返回行的该参数值与TOPn(PERCENT)行中的最后一行的该参数值相同。只能在SELECT语句中且只有在指定了ORDERBY子句之后,才能指定TOP...WITHTIES。
注意:返回的记录关联顺序是任意的。ORDERBY不影响此规则
来源:MSDN,http://msdn.microsoft.com/zh-cn/library/ms189463.aspx
select top1* fromstudent order byscore desc
[/code]
但是这样做你会发现,如果有几个人分数并列第一,这样就只能取到一个记录。用下面的代码的话,就可以正确地取出分数第一的所有记录:
select top1 withties* fromstudent order byscore desc
[/code]
由于以前没有用过withties,看到这个比较新奇,故随后MSDN,Google,Baidu之。
WITHTIES
指定从基本结果集中返回额外的行,对于ORDERBY列中指定的排序方式参数,这些额外的返回行的该参数值与TOPn(PERCENT)行中的最后一行的该参数值相同。只能在SELECT语句中且只有在指定了ORDERBY子句之后,才能指定TOP...WITHTIES。
注意:返回的记录关联顺序是任意的。ORDERBY不影响此规则
来源:MSDN,
MSDN中指出这些额外的返回行的参数值与TOPn(PERCENT)行中的最后一行的该参数值相同。这个地方该怎么理解呢?其实是如果按照orderby参数排序TOPn(PERCENT)返回了前面n(pencent)个记录,但是n+1…n+k条记录和排序后的第n条记录的参数值(orderby后面的参数)相同,则n+1、…、n+k也返回。n+1、…、n+k就是额外的返回值。
举个例子,假设有如下记录:
studentID | courseName | score |
09212744 | 数据库 | 90 |
09212745 | 数据库 | 90 |
09212746 | 数据库 | 90 |
09212750 | 数据库 | 85 |
09212719 | 数据库 | 84 |
09212720 | 数据库 | 80 |
09212742 | 数据库 | 80 |
09212751 | 数据库 | 75 |
09212755 | 数据库 | 74 |
09212740 | 数据库 | 70 |
select top6* fromstudent order byscore desc
将返回如下结果:
图1不带withties(注意最好一条记录)
select top6 withties* fromstudent order byscore desc
[/code]
将返回如下结果:
图2带withties(多了第7条记录)
结果一目了然,不用多解释!
插曲:其实在这个过程中有个小插曲,我首先是Google“withties”搜到了这篇文章
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
这就是
相关文章推荐
- 一句SQL查出所有课程成绩最高和最低的学生及其分数
- sql查询每科成绩最高的人和分数
- SQL 行变列(学生成绩问题)
- 统计成绩SQL语句
- SQL常见面试题(学生表_课程表_成绩表_教师表)
- 习题 9.5 有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩,从键盘输入10个学生数据,要求输出3门课程总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课程成绩、平均分数)。
- 查询每个学生的各科成绩sql语句
- 求学生选课平均成绩的SQL语句
- sql面试题一 学生成绩
- min聚合函数查询带有额外字段sql|dense_rank()over(partition)|+班级学生成绩最高
- 用Oracle PL/SQL 编程实现小数转分数的方法
- 学生表 课程表 成绩表 教师表 50个常用sql语句
- SQL 课程成绩统计报表 例子
- 学生表 课程表 成绩表 教师表 50个常用sql语句
- 【转】 sql统计-关于学生成绩(答案)
- Sql -- 练习1 查询每科成绩前两名的学生信息
- 文件操作:有五个学生,每个学生有 3 门课的成绩,从键盘输入以上数据(包 括学生号,姓名,三门课成绩),计算出平均成绩,将所输入有的数据和计算出 的平均分数存放在磁盘文件 "stud "中
- 成绩排名SQL语句
- 达内实训—第二天小练习(输入班级成绩 求平均分数 最大分数 最小分数)
- 成绩查询sql