SQLServer分析函数(⼜称窗⼝函数)
1.简介:
SQL Server 中的窗⼝函数帮助你迅速查看不同级别的聚合,通过它可以⾮常⽅便地累计总数、移动平均值、以及执⾏其它计算。窗⼝函数功能⾮常强⼤,使⽤起来也⼗分容易。可以使⽤这个技巧⽴即得到⼤量统计值。
窗⼝是⽤户指定的⼀组⾏。 开窗函数计算从窗⼝派⽣的结果集中各⾏的值。
2.适⽤范围:
排名开窗函数和聚合开窗函数.
也就是说窗⼝函数是结合排名开窗函数或者聚合开窗函数⼀起使⽤
OVER⼦句前⾯必须是排名函数或者是聚合函数
3.例题:
--建⽴订单表
create table SalesOrder(
OrderID int, --订单id
OrderQty decimal(18,2) --数量
)
go
--插⼊数据
inrt into SalesOrder
lect1,2.0
union all
lect1,1.0
union all
lect1,3.0
union all
lect2,6.0
union all
lect2,1.1
union all
lect3,8.0
union all
lect3,1.1
union all
lect3,7.0
go
--查询得如下结果
香木盆栽lect*from SalesOrder
go
OrderID OrderQty
----------- ------------
1 2.00
1 1.00
1 3.00
2 6.00
2 1.10
38.00
3 1.10
37.00
现要求显⽰汇总总数,每当所占⽐例,分组汇总数,每单在各组所占⽐例,要求格式如下:
OrderID OrderQty 汇总 每单⽐例 分组汇总 每单在各组⽐例
1 2.00 29.20 0.0685 6.00 0.3333
1 1.00 29.20 0.034
2 6.00 0.1667
1 3.00 29.20 0.1027 6.00 0.5000
2 6.00 29.20 0.2055 7.10 0.8451
2 1.10 29.20 0.0377 7.10 0.1549
3 8.00 29.20 0.2740 16.10 0.4969
3 1.10 29.20 0.0377 16.10 0.0683
3 7.00 29.20 0.2397 16.10 0.4348
--利⽤窗⼝函数和聚合开窗函数,可以很快实现上述要求
lect OrderID,OrderQty,
sum(OrderQty) over() as[汇总],
convert(decimal(18,4), OrderQty/sum(OrderQty) over() ) as[每单所占⽐例],
sum(OrderQty) over(PARTITION BY OrderID) as[分组汇总],
convert(decimal(18,4),OrderQty/sum(OrderQty) over(PARTITION BY OrderID)) as[每单在各组所占⽐例] from SalesOrder
order by OrderID胡以晃
上⾯演⽰的都是窗⼝函数与聚合开窗函数的使⽤,它与排名开窗函数请看下⾯例题:
--与排名开窗函数使⽤
lect OrderID,OrderQty,
rank() over(PARTITION BY orderid order by OrderQty ) as[分组排名],
rank() over(order by OrderQty ) as[排名]
from SalesOrder
order by orderid asc
--查询得如下结果
OrderID OrderQty 分组排名 排名
1 2.0024
1 3.0035
1 1.0011
2 1.1012
2 6.0026
37.0027
38.0038
3 1.1012
排名函数 (Transact-SQL)
排名函数为分区中的每⼀⾏返回⼀个排名值。根据所⽤的函数,某些⾏可能与其他⾏接收到相同的值。排名函数具有不确定性。
Transact-SQL 提供下列排名函数:
安分守己的意思RANK NTILE
DENSE_RANK ROW_NUMBER
rank: 如果两个或多个⾏与⼀个排名关联,则每个关联⾏将得到相同的排名。例如,如果两位顶尖销售员具有同样的 SalesYTD 值,他们将并列第⼀。由于已有两⾏排名在前,所以具有下⼀个最⼤ SalesYTD 的销售⼈员将排名第三。因此,RANK 函数并不总返回连续整数。
den_rank: 如果有两个或多个⾏受同⼀个分区中排名的约束,则每个约束⾏将接收相同的排名。例如,如果两位顶尖销售员具有相同的SalesYTD 值,则他们将并列第⼀。接下来 SalesYTD 最⾼的销售⼈员排名第⼆。该排名等于该⾏之前的所有⾏数加⼀。因
此,DENSE_RANK 函数返回的数字没有间断,并且始终具有连续的排名。
ntile: 将有序分区中的⾏分发到指定数⽬的组中。各个组有编号,编号从⼀开始。对于每⼀个⾏,NTILE 将返回此⾏所属的组的编号。
row_number: 返回结果集分区内⾏的序列号,每个分区的第⼀⾏从 1 开始。
create table test1(typeid int, typevalue int);
约翰杜威
inrt into test1 values(1, 11);巡防队员
inrt into test1 values(1, 12);
inrt into test1 values(1, 13);
inrt into test1 values(2, 21);
慰勉的意思inrt into test1 values(2, 22);
--选出每⼀组typeid中, typevalues值最⼩的⼀条记录.
lect * from (
lect typeid, typevalue,
row_number() over (partition peid order pevalue asc) as topN from test1 a ) b
维修工作总结
手机彩铃在哪里设置
where topN = 1;
-- 返回结果集如下:
typeid typevalue topN
1 11 1
2 21 1
这4个函数中,还⽀持分组的语句