[Sql Server 2008 基础] With Ties. Over()子句
with ties
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
通俗解释
如果按照order by 参数排序TOP n(PERCENT)返回了前面n(pencent)个记录,但是n+1…n+k条记录和排序后的第n条记录的参数值(order by 后面的参数)相同,则n+1、…、n+k也返回。n+1、…、n+k就是额外的返回值。
举例说明
- declare @tb table(tname varchar(10), score int)
- insert into @tb select 'a',80
- insert into @tb select 'b',80
- insert into @tb select 'c',70
- insert into @tb select 'd',60
- insert into @tb select 'e',50
- insert into @tb select 'f',40
- insert into @tb select 'g',40
- insert into @tb select 'h',30
- insert into @tb select 'i',80
- insert into @tb select 'j',70
- select top 4 * from @tb order by score desc
返回结果如下
. 但是我们发现 j的分数也是70, 这个时候我们需要统计j的时候, with ties就拍上用场了.
- select top 4 with ties * from @tb order by score desc
Over子句
OVER子句用于为行为定义一个窗口(windows),以便进行特定的运算。可以把行的窗口简单地认为是运算将要操作的一个行的集合。例如,聚合函数和排名函数都是可以支持OVER子句的运算类型。由于OVER子句为这些函数提供了一个行的窗口,所以这些函数也称之为开窗函数。
简单的理解, 就是over提供了任意的聚合. 在一般情况下, 如果我们要用到聚合函数, 需要先使用groupby分组. 用了over之后, 某些情况就简单很多.
如果over()里面没有子句, 那么, over子句前面的聚合函数的操作窗口(可操作的数据行集合)为该次查询返回的所有行. over子句提供partition by进行分区. 其实就是把操作窗口(可操作的数据行集合)进行分组, 并匹配出符合分组参数的行集合. 那么我们来看例子.
某表如下, 订单Id, 所属客户, 和价值val.
我们想在后面加上几列数据以更好地支持我们的显示系统. totalValue(查询的所有价值之和), avgValue(查询的所有价值平均数),custAvgValue(某客户的订单价值之和),custTotalValue(某客户的订单价值平均)
期望得到如图
- declare @dt datetime;set @dt=GETDATE()
- SELECT orderid, custid, val,
- SUM(val) OVER() AS totalvalue,--所有行作为操作值
- AVG(val) over() as avgvalue,--所有行作为操作值
- AVG(val) over(PARTITION BY custid) as custAvgValue,--按客户ID进行分区, 并自动抽取出符合当前行的分区参数(这里是custid)的数据行
- SUM(val) OVER(PARTITION BY custid) AS custtotalvalue--按客户ID进行分区, 并自动抽取出符合当前行的分区参数(这里是custid)的数据行
- FROM Sales.OrderValues;
- --同样的效果, 用老式的方式进行查询
- select DATEDIFF(ms,@dt,getdate())
- set @dt=GETDATE()
- SELECT orderid, custid, val,
- (select SUM(val) from sales.OrderValues) AS totalvalue,
- (select avg(val) from sales.OrderValues) as avgvalue,
- (select avg(val) from sales.OrderValues where custid=s.custid) as custAvgValue,
- (select sum(val) from sales.OrderValues where custid=s.custid) AS custtotalvalue
- FROM Sales.OrderValues s;
- select DATEDIFF(ms,@dt,getdate())
- --表的数据为800多行. 第一种方式13-20ms. 第二种方式耗时40-50ms. 大数据量可见效率之差
partition by 和 order by连用.
sqlserver2005之后, 有一个排序函数, row_number() over(order by XX).
准备脚本
- declare @Student table --学生成绩表
- (
- id int, --主键
- Grade int, --班级
- Score int --分数
- )
- insert @Student
- select 1,1,88
- union all select 2,1,66
- union all select 3,1,75
- union all select 4,2,30
- union all select 5,2,70
- union all select 6,2,80
- union all select 7,2,60
- union all select 8,3,90
- union all select 9,3,70
- union all select 10,3,80
- --不分年级按学生成绩排名
- select *,ROW_NUMBER() over(order by Score desc) as Sequence from @Student
- --分年级按学生成绩排名,并取得年级平均成绩
- select *, ROW_NUMBER() over(partition by grade order by score desc) as sequence,
- AVG(score*1.0) over(partition by grade) gradeAvgScore from @Student
关于over子句和其他排名函数的使用请参考, 相当不错哦http://www.cnblogs.com/tylerdonet/archive/2011/07/08/2101384.html
[Sql Server 2008 基础] With Ties. Over()子句的更多相关文章
- sql server 2008 基础知识
一.配置管理器 1.管理服务 使用配置管理器可以启动.停止.重新启动.继续或暂停服务. 服务器和客户端网络协议 2.SQLSMS 简介:SQLSMS是一个集成环境,用于访问.配置.管理和开发SQL ...
- SQL Server 2008空间数据应用系列一:空间信息基础
转自:http://www.cnblogs.com/beniao/archive/2011/01/18/1933412.html Microsoft SQL Server 2008 提供了全面性的空间 ...
- SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础
原文:SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础 在前一篇博文中我们学习到了一些关于地理信息的基础知识,也学习了空间参照系统,既地球椭球体.基准.本初 ...
- SQL Server 2008空间数据应用系列四:基础空间对象与函数应用
原文:SQL Server 2008空间数据应用系列四:基础空间对象与函数应用 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. ...
- SQL Server 2008中新增的 1.变更数据捕获(CDC) 和 2.更改跟踪
概述 1.变更数据捕获(CDC) 每一次的数据操作都会记录下来 2.更改跟踪 只会记录最新一条记录 以上两种的区别: http://blog.csdn.n ...
- SQL Server 2008中新增的变更数据捕获(CDC)和更改跟踪
来源:http://www.cnblogs.com/downmoon/archive/2012/04/10/2439462.html 本文主要介绍SQL Server中记录数据变更的四个方法:触发器 ...
- 《转》SQL Server 2008 数据维护实务
SQL Server 2008 数据维护实务 http://blog.csdn.net/os005/article/details/7739553 http://www.cnblogs.com/xun ...
- 《SQL Server 2008从入门到精通》--20180710
目录 1.使用Transact-SQL语言编程 1.1.数据定义语言DDL 1.2.数据操纵语言DML 1.3.数据控制语言DCL 1.4.Transact-SQL语言基础 2.运算符 2.1.算数运 ...
- 使用MyEclipse中servlet对SQL Server 2008的CRUD
1.在MyEclipse下建立Web Project,找到根目录建立Database文件夹和Doc文件夹,Database用于保存数据库信息,Doc用于保存数据库表信息. 2.打开SQL Server ...
随机推荐
- 经验总结56--mybatis返回主键
使用mybatis框架时,有时候须要新插入的数据的主键是多少. 1.oracle 因为oracle是建的序列文件,获取ID值. <insert id="insert" par ...
- Python数据结构之树
二叉树 嵌套列表方式 # coding:utf-8 # 列表嵌套法 def BinaryTree(r): return [r, [], []] def insertLeft(root, newBran ...
- html表单元素及表单元素详解
原文 https://www.jianshu.com/p/b427daa8663d 大纲 1.认识表单 2.认识表单元素 3.表单元素的分类 4.表单元素——文本框 5.表单元素button 6.表单 ...
- DirectX 11游戏编程学习笔记之1: 开场白
本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com 这是我之前的博客系列"DirectX9.0c游戏开发手记之'龙书'第二版学习笔记 ...
- [Angular2 Router] Setup page title with Router events
Article import 'rxjs/add/operator/filter'; import 'rxjs/add/operator/map'; import 'rxjs/add/operator ...
- [Linux] Search the contents of files using grep
Learn the basic syntax for using grep to search the contents of a single file or files. It's like CM ...
- jquery pagination分页的两种实现方式
原文链接:http://blog.csdn.net/qq_37936542/article/details/79457012 此插件是jQuery的ajax分页插件.如果你用到此插件作分页的时候,涉及 ...
- EM12C 安装及卸载 注意点整理
版本号: em12c 12.1.0.4 OS : redhat 5.7 x86_64bit (CentOS6.2,測试过,当时因glibc*.i686包安装一直报错.所以放弃了) ...
- 基于GTID多源复制扩展
对一个运行很久的库做备份恢复建同步 不能使用xtrabackup 使用mysqldump导数据: mysqldump -S /data/mysql/3307/tmp/3307.sock --sin ...
- 简洁常用权限系统的设计与实现(六):不维护节点的深度level,手动计算level,构造树 (把一颗无序的树,变成有序的)
本篇介绍的方法,参考了网上的代码.在递归过程中,计算level,是受到了这种方法的启发. CSDN上有篇关于树的算法,目标是把一个无序的树,变成有序的. 我看了下代码,并运行了下,感觉是可行的. 我 ...