OVER()开窗函数的使用
(2012-11-26 12:23:55)
标签:
sqlover开窗函数it |
分类: SQLServer2008 |
-- 聚合函数和排名函数都支持OVER()子句
-- 注意区别聚合函数和GROUP
BY组合的分组统计
SELECT orderid ,custid, val,SUM (val) OVER() AS totalvalue
FROM Sales .OrderValues;
10248
85
440.00
1265793.22
10249
79
1863.40
1265793.22
10250
34
1552.60
1265793.22
10251
84
654.06
1265793.22
10252
76
3597.90
1265793.22
10253
34
1444.80
1265793.22
10254
14
556.62
1265793.22
10255
68
2490.50
1265793.22
10249
10250
10251
10252
10253
10254
10255
SELECT orderid ,custid, val,SUM (val) OVER() AS totalvalue ,
FROM Sales .OrderValues;
10643
1
814.50
1265793.22
4273.00
10692
1
878.00
1265793.22
4273.00
10702
1
330.00
1265793.22
4273.00
10835
1
845.80
1265793.22
4273.00
10952
1
471.20
1265793.22
4273.00
11011
1
933.50
1265793.22
4273.00
10926
2
514.40
1265793.22
1402.95
10759
2
320.00
1265793.22
1402.95
10625
2
479.75
1265793.22
1402.95
10308
2
88.80
1265793.22
1402.95
10365
3
403.20
1265793.22
7023.98
10507
3
749.06
1265793.22
7023.98
10692
10702
10835
10952
11011
10926
10759
10625
10308
10365
10507
--查询OrderValues 的每一行计算当前价格占总价格的百分比,以及当前价格占客户总价格的百分比
--表达式中使用了十进制实数(后面加个点),而不是直接使用整数,因为这样可以隐式地将整数值 val和SUM(val) 转换成十进制实数值。
SELECT orderid ,custid, val,100. * val /SUM( val) OVER() AS pctall ,
FROM Sales .OrderValues;
10643
1
814.50
0.0643470029014691672941
19.0615492628130119354083
10692
1
878.00
0.0693636200705830925528
20.5476246197051252047741
10702
1
330.00
0.0260706089103558320528
7.7229113035338169904048
10692
10702
--OVER()支持种排名函数:ROWNUMBER行号、 RANK排名、DENSE_RANK 密集排名,以及 NTILE
--NTILE(expr) OVER([PARTITION BY]ORDER
BY) :把有序的数据集平均分配到 expr指定的数量的桶中,将桶号分配给每一行;如果不能平均分配,则较小桶号的桶分配额外的行,并且各个桶中能放的行数最多相差。
SELECT orderid ,custid, val,
FROM Sales.OrderValues
WHERE val<=48.75
ORDER BY val;
10782
12
12.50
1
1
1
1
10807
27
18.40
2
2
2
1
10586
66
23.80
3
3
3
1
10767
76
28.00
4
4
4
1
10898
54
30.00
5
5
5
1
10900
88
33.75
6
6
6
2
11051
41
36.00
7
7
7
2
10883
48
36.00
8
7
7
2
10815
71
40.00
9
9
8
2
10674
38
45.00
10
10
9 3
10807
10586
10767
10898
10900
11051
10883
10815
10674