SQL with ties的理解与 top 10 with ties

“从100万条记录中的得到成绩最高的记录”。看到这个题目,通常我们的做法是:

select top 1 * from student order by score desc

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

select top 1 with ties * from student order by score desc

由于以前没有用过with ties ,看到这个比较新奇,故随后MSDN,Google,Baidu之。

WITH TIES

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

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

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

MSDN中指出这些额外的返回行的参数值与TOP n(PERCENT)行中的最后一行的该参数值相同。这个地方该怎么理解呢?其实是如果按照order by 参数排序TOP n(PERCENT)返回了前面n(pencent)个记录,但是n+1…n+k条记录和排序后的第n条记录的参数值(order by 后面的参数)相同,则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 top 6 * from student order by score desc
将返回如下结果:
 
图1 不带with ties(注意最好一条记录)
select top 6 with ties * from student order by score desc

将返回如下结果:

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

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

插曲:其实在这个过程中有个小插曲,我首先是Google “with ties” 搜到了这篇文章With Ties on SQL Server 2005。内容如下(翻译之后):

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

  • select top 5 * from batch where module = ‘CA’ order by curyrate desc

BatNbr CuryRate
000345 9900
000350 9900
000351 9900
000400 9800
000450 9750

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

  • select top 5 with ties * from batch where module = ‘CA’ order by CuryRate desc

BatNbr CuryRate
000345 9900
000350 9900
000351 9900
000400 9800
000450 9750
000451 9750
000475 9500
000456 9400

这就是With Ties on SQL Server 2005的全部内容,这导致我对with ties理解错误!认为加上with ties后,会返回除了重复的记录会返回n条记录,还一直认为是MSDN解释错了(⊙﹏⊙b汗)。而且这篇文章被许多人装载了,博客园和csdn都要,不知道我对那片文章理解错了还是他本来就错了。如果是我理解错了,请告诉我,谢谢!

该文章是转载的。

原文地址:https://www.cnblogs.com/Leo_wl/p/12327003.html

时间: 2024-11-09 09:55:24

SQL with ties的理解与 top 10 with ties的相关文章

SQL Server’s Storage Top 10 Best Practices

好文章, 简明扼要. Storage Top 10 Best Practices http://technet.microsoft.com/en-us/library/cc966534.aspx SQL Server’s Storage Top 10 Best Practices

Top 10 steps to optimize data access in SQL Server

2009年04月28日 Top 10 steps to optimize data access in SQL Server: Part I (use indexing) 2009年06月01日 Top 10 steps to optimize data access in SQL Server: Part II (Re-factor TSQL and apply best practices) 2009年06月08日 Top 10 steps to optimize data access i

SQLServer学习笔记<>.基础知识,一些基本命令,单表查询(null top用法,with ties附加属性,over开窗函数),排名函数

Sqlserver基础知识 (1)创建数据库 创建数据库有两种方式,手动创建和编写sql脚本创建,在这里我采用脚本的方式创建一个名称为TSQLFundamentals2008的数据库.脚本如下:   同时往数据库表插入一些数据,用户后续对数据库的sql的练习.在这里有需要的可以下载相应的脚本进行数据库的初始化.我放到百度云上面,请戳 我:http://yun.baidu.com/share/link?shareid=3635107613&uk=2971209779,提供了<Sqlserver

TOP 10开源的推荐系统简介

最近这两年推荐系统特别火,本文搜集整理了一些比较好的开源推荐系统,即有轻量级的适用于做研究的SVDFeature.LibMF.LibFM等,也有重量级的适用于工业系统的 Mahout.Oryx.EasyRecd等,供大家参考.PS:这里的top 10仅代表个人观点. #1.SVDFeature 主页:http://svdfeature.apexlab.org/wiki/Main_Page 语言:C++一个feature-based协同过滤和排序工具,由上海交大Apex实验室开发,代码质量较高.在

OWASP(Open Web Application Security Project) Top 10 for JavaScript

Injection Injection flaws, such as SQL, OS, and LDAP injection, occur when untrusted data is sent to an interpreter as part of a command or query. The attacker's hostile data can trick the interpreter into executing unintended commands or accessing u

关于TOP (n) WITH TIES的运用

1 SELECT TOP (5) orderid, orderdate, custid, empid 2 FROM Sales.Orders 3 ORDER BY orderdate DESC, orderid DESC; 4 5 SELECT TOP (5) WITH TIES orderid, orderdate, custid, empid 6 FROM Sales.Orders 7 ORDER BY orderdate DESC; 上述代码执行结果: 即第二条SQL语句执行结果多了3条数

[爆笑吐槽]2014年10大网络流行语Top 10 online buzzwords of 2014

[爆笑吐槽]2014年10大网络流行语Top 10 online buzzwords of 2014 2014年10大网络流行语 1.且行且珍惜(Cherish what you have at the moment) 出处:2014年3月底,文章回应“出轨门”承认了“劈腿”传闻.3分钟后,马伊琍在微博写了句“恋爱虽易,婚姻不易,且行且珍惜”回应.于是“且行且珍惜”开始流行. Origin: At the end of March in 2014, Wen Zhang responded to

OWAP Top 10

2013 Top 10 List   A1-Injection Injection flaws, such as SQL, OS, and LDAP injection occur when untrusted data is sent to an interpreter as part of a command or query. The attacker's hostile data can trick the interpreter into executing unintended co

OWASP Top 10移动安全漏洞

• 弱服务器端控件 在OWASP排第一的漏洞是“脆弱的服务器端控件”,顾名思义,就是没有以一个安全的方式从移动应用程序向服务器端发送数据,或在发送数据时暴露了一些敏感的API.例如,考虑对一个Android应用程序登录服务器的凭据进行身份验证,而没有对输入进行验证.攻击者可以以这样一种方式修改凭证来获得服务器敏感的或未经授权的区域.这是移动应用以及Web应用程序都存在的一个漏洞. • 不安全的数据存储 在设备上存储任意用户都可以访问的与应用相关的信息.许多Android应用在shared pre