加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

OVER()开窗函数的使用

(2012-11-26 12:23:55)
标签:

sql

over

开窗函数

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

SELECT orderid ,custid, val,SUM (val) OVER() AS totalvalue ,
       SUM(val )OVER( PARTITION BY custid) AS custtotalvalue
FROM Sales .OrderValues;

10643        814.50     1265793.22     4273.00
10692        878.00     1265793.22     4273.00
10702        330.00     1265793.22     4273.00
10835        845.80     1265793.22     4273.00
10952        471.20     1265793.22     4273.00
11011        933.50     1265793.22     4273.00
10926        514.40     1265793.22     1402.95
10759        320.00     1265793.22     1402.95
10625        479.75     1265793.22     1402.95
10308        88.80      1265793.22     1402.95
10365        403.20     1265793.22     7023.98
10507        749.06     1265793.22     7023.98

--查询OrderValues 的每一行计算当前价格占总价格的百分比,以及当前价格占客户总价格的百分比
--表达式中使用了十进制实数(后面加个点),而不是直接使用整数,因为这样可以隐式地将整数值 valSUM(val) 转换成十进制实数值。

SELECT orderid ,custid, val,100. * val /SUM( val) OVER() AS pctall ,
       100. * val /SUM( val) OVER(PARTITION BY custid) AS pctcust
FROM Sales .OrderValues;   

10643        814.50     0.0643470029014691672941     19.0615492628130119354083
10692        878.00     0.0693636200705830925528     20.5476246197051252047741
10702        330.00     0.0260706089103558320528     7.7229113035338169904048

--OVER()支持种排名函数:ROWNUMBER行号、 RANK排名、DENSE_RANK 密集排名,以及 NTILE
--NTILE(expr) OVER([PARTITION BY]ORDER BY) :把有序的数据集平均分配到 expr指定的数量的桶中,将桶号分配给每一行;如果不能平均分配,则较小桶号的桶分配额外的行,并且各个桶中能放的行数最多相差。
SELECT orderid ,custid, val,
       ROW_NUMBER() OVER(ORDER BY val)AS rownum,
       RANK() OVER(ORDER BY val)AS rank,
       DENSE_RANK()OVER(ORDER BY val)AS dense_rank,
       NTILE(3) OVER(ORDER BY val)AS ntile
FROM Sales.OrderValues
WHERE val<=48.75
ORDER BY val;

10782     12     12.50              1
10807     27     18.40              1
10586     66     23.80              1
10767     76     28.00              1
10898     54     30.00              1
10900     88     33.75              2
11051     41     36.00              2
10883     48     36.00              2
10815     71     40.00              2
10674     38     45.00     10     10     9      3
11057     53     45.00     11     10     9      3
10271     75     48.00     12     12     10     3
10602     83     48.75     13     13     11     3

SELECT orderid,custid,val,
       ROW_NUMBER() OVER(PARTITION BY custid ORDER BY val)AS custnum
FROM Sales.OrderValues
ORDER BY custid,val;

10702        330.00     1
10952        471.20     2
10643        814.50     3
10835        845.80     4
10692        878.00     5
11011        933.50     6
10308        88.80      1
10759        320.00     2
10625        479.75     3
10926        514.40     4

0

阅读 收藏 喜欢 打印举报/Report
前一篇:TOP
后一篇:排名函数
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有