oracle rows range keep 的使用

1. rows的使用

--按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


2. range的使用

--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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值