SQLServer分析函数(又称窗口函数)

更新时间:2023-07-29 04:57:01 阅读: 评论:0

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个函数中,还⽀持分组的语句

本文发布于:2023-07-29 04:57:01,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1122380.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:函数   排名   开窗   聚合   编号   分区
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图