[Sql Server 2008 基础] With Ties. Over()子句
2011-07-30 18:23
381 查看
.postbody{font-size:11px;}WITHTIES指定从基本结果集中返回额外的行,对于ORDERBY列中指定的排序方式参数,这些额外的返回行的该参数值与TOPn(PERCENT)行中的最后一行的该参数值相同。只能在SELECT语句中且只有在指定了ORDERBY子句之后,才能指定TOP...WITHTIES。
注意:返回的记录关联顺序是任意的。ORDERBY不影响此规则
来源:MSDN,http://msdn.microsoft.com/zh-cn/library/ms189463.aspx
withties
注意:返回的记录关联顺序是任意的。ORDERBY不影响此规则
来源:MSDN,
如果按照orderby参数排序TOPn(PERCENT)返回了前面n(pencent)个记录,但是n+1…n+k条记录和排序后的第n条记录的参数值(orderby后面的参数)相同,则n+1、…、n+k也返回。n+1、…、n+k就是额外的返回值。
declare@tbtable(tnamevarchar(10),scoreint)
insertinto@tbselect'a',80
insertinto@tbselect'b',80
insertinto@tbselect'c',70
insertinto@tbselect'd',60
insertinto@tbselect'e',50
insertinto@tbselect'f',40
insertinto@tbselect'g',40
insertinto@tbselect'h',30
insertinto@tbselect'i',80
insertinto@tbselect'j',70
selecttop4*from@tborderbyscoredesc
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
返回结果如下
.但是我们发现j的分数也是70,这个时候我们需要统计j的时候,withties就拍上用场了.
selecttop4withties*from@tborderbyscoredesc
Over子句
OVER子句用于为行为定义一个窗口(windows),以便进行特定的运算。可以把行的窗口简单地认为是运算将要操作的一个行的集合。例如,聚合函数和排名函数都是可以支持OVER子句的运算类型。由于OVER子句为这些函数提供了一个行的窗口,所以这些函数也称之为开窗函数。
简单的理解,就是over提供了任意的聚合.在一般情况下,如果我们要用到聚合函数,需要先使用groupby分组.用了over之后,某些情况就简单很多.
如果over()里面没有子句,那么,over子句前面的聚合函数的操作窗口(可操作的数据行集合)为该次查询返回的所有行.over子句提供partitionby进行分区.其实就是把操作窗口(可操作的数据行集合)进行分组,并匹配出符合分组参数的行集合.那么我们来看例子.
某表如下,订单Id,所属客户,和价值val.
我们想在后面加上几列数据以更好地支持我们的显示系统.totalValue(查询的所有价值之和),avgValue(查询的所有价值平均数),custAvgValue(某客户的订单价值之和),custTotalValue(某客户的订单价值平均)
期望得到如图
declare@dtdatetime;set@dt=GETDATE()
SELECTorderid,custid,val,
SUM(val)OVER()AStotalvalue,--所有行作为操作值
AVG(val)over()asavgvalue,--所有行作为操作值
AVG(val)over(PARTITIONBYcustid)ascustAvgValue,--按客户ID进行分区,并自动抽取出符合当前行的分区参数(这里是custid)的数据行
SUM(val)OVER(PARTITIONBYcustid)AScusttotalvalue--按客户ID进行分区,并自动抽取出符合当前行的分区参数(这里是custid)的数据行
FROMSales.OrderValues;
--同样的效果,用老式的方式进行查询
selectDATEDIFF(ms,@dt,getdate())
set@dt=GETDATE()
SELECTorderid,custid,val,
(selectSUM(val)fromsales.OrderValues)AStotalvalue,
(selectavg(val)fromsales.OrderValues)asavgvalue,
(selectavg(val)fromsales.OrderValueswherecustid=s.custid)ascustAvgValue,
(selectsum(val)fromsales.OrderValueswherecustid=s.custid)AScusttotalvalue
FROMSales.OrderValuess;
selectDATEDIFF(ms,@dt,getdate())
--表的数据为800多行.第一种方式13-20ms.第二种方式耗时40-50ms.大数据量可见效率之差
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
partitionby和orderby连用.
sqlserver2005之后,有一个排序函数,row_number()over(orderbyXX).
准备脚本
declare@Studenttable--学生成绩表
(
idint,--主键
Gradeint,--班级
Scoreint--分数
)
insert@Student
select1,1,88
unionallselect2,1,66
unionallselect3,1,75
unionallselect4,2,30
unionallselect5,2,70
unionallselect6,2,80
unionallselect7,2,60
unionallselect8,3,90
unionallselect9,3,70
unionallselect10,3,80
--不分年级按学生成绩排名
select*,ROW_NUMBER()over(orderbyScoredesc)asSequencefrom@Student
--分年级按学生成绩排名,并取得年级平均成绩
select*,ROW_NUMBER()over(partitionbygradeorderbyscoredesc)assequence,
AVG(score*1.0)over(partitionbygrade)gradeAvgScorefrom@Student
关于over子句和其他排名函数的使用请参考,相当不错哦
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}