您的位置:首页 > 数据库

[Sql Server 2008 基础] With Ties. Over()子句

2011-07-30 18:23 381 查看
.postbody{font-size:11px;}

withties

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

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

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

通俗解释

如果按照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子句和其他排名函数的使用请参考,相当不错哦/article/4751491.html


.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;}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐
章节导航