Chinaunix首页 | 论坛 | 博客
  • 博客访问: 52164
  • 博文数量: 42
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 399
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-26 20:33
文章分类

全部博文(42)

文章存档

2014年(3)

2013年(39)

我的朋友

分类: Oracle

2013-10-11 17:25:48

http://www.itpub.net/thread-1336505-1-1.html 
dingjun123回覆,很清晰,借來參考

rows是物理行,就是按行的位置,根据位置计算窗口范围
range是逻辑行,是按单元格值和偏移量计算窗口范围


--按salary排序,计算当前行到下面两行的salary累加值,红色部分为例,可以看到2340等于3个salary的值,物理行范围,一眼看就看出来了

SQL> select id,last_name,salary,dept_id,
  2  sum(salary) over(order by salary
  3   rows between current row and 2 following)
  4  from s_emp;

      ID LAST_NAME                SALARY  DEPT_ID SUM(SALARY)OVER(ORDERBYSALARYR
-------- ------------------------- ------------- -------- ------------------------------
      20 Newman                   750.00       43                           2340
      19 Patel                         795.00       42                           2390
      23 Patel                          795.00       34                           2445
      22 Chang                        800.00       44                           2510
      21 Markarian                  850.00       43                           2650
      24 Dancs                        860.00       45                           2900
      17 Smith                         940.00       41                           3140
       8 Biri                           1100.00       43                           3400
      25 Schwartz                   1100.00       45                           3500
      18 Nozaki                      1200.00       42                           3650
       6 Urguhart                   1200.00       41                           3750
       7 Menchu                     1250.00       42                           3857
       9 Catchpole                  1300.00       44                           4007
      10 Havel                        1307.00       45                           4107
       3 Nagayama                1400.00       31                           4200
      16 Maduro                    1400.00       41                           4250
      11 Magee                      1400.00       31                           4300
      15 Dumas                      1450.00       35                           4350
       4 Quick-To-See            1450.00       10                           4390
       2 Ngao                        1450.00       41                           4455
      12 Giljum                       1490.00       32                           4530
      13 Sedeghi                    1515.00       33                           4590
      14 Nguyen                     1525.00       34                           5575
       5 Ropeburn                  1550.00       50                           4050
       1 Velasquez                 2500.00       50                           2500

25 rows selected

SQL> 

--range是逻辑行的范围,要经过计算的,一般range后面是数值或时间间隔等,这样根据当前行和range的表达式就能计算当前行对应的窗口范围,这个是逻辑范围,一眼
--看不出来,要经过range后的表达式和当前行的值计算才知道,这就是rows和range的区别。
--如下:按salary排序,计算当前行到比当前行的salary最大大350结束的窗口的累加salary值,如红色7990=第1行到第9行最大为1100的行结束,第1行对应的窗口计算范围就有9行,因为第10行的salary是1200,那么1200-750=450>350。
SQL> select id,last_name,salary,dept_id,
  2  sum(salary) over(order by salary
  3   range between current row and 350 following)
  4  from s_emp;

      ID LAST_NAME                SALARY  DEPT_ID SUM(SALARY)OVER(ORDERBYSALARYR
-------- ------------------------- ------------- -------- ------------------------------
      20 Newman                    750.00       43                           7990
      19 Patel                          795.00       42                           7240
      23 Patel                          795.00       34                           7240
      22 Chang                        800.00       44                           5650
      21 Markarian                  850.00       43                           7250
      24 Dancs                        860.00       45                           6400
      17 Smith                         940.00       41                           6790
       8 Biri                           1100.00       43                          17007
      25 Schwartz                   1100.00       45                          17007
      18 Nozaki                      1200.00       42                          20887
       6 Urguhart                   1200.00       41                          20887
       7 Menchu                     1250.00       42                          18487
       9 Catchpole                  1300.00       44                          17237
      10 Havel                        1307.00       45                          15937
       3 Nagayama                1400.00       31                          14630
      16 Maduro                    1400.00       41                          14630
      11 Magee                      1400.00       31                          14630
      15 Dumas                      1450.00       35                          10430
       4 Quick-To-See            1450.00       10                          10430
       2 Ngao                        1450.00       41                          10430
      12 Giljum                       1490.00       32                           6080
      13 Sedeghi                    1515.00       33                           4590
      14 Nguyen                     1525.00       34                           3075
       5 Ropeburn                  1550.00       50                           1550
       1 Velasquez                 2500.00       50                           2500

25 rows selected
阅读(1200) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~