oracle中range/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

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章