對Oracle分析函數的初步理解

來源:互聯網
上載者:User

版本:10.1 樣本資料庫:ORCL  模式:hr


開窗函數的的理解:
開窗函數指定了分析函數工作的資料視窗大小,這個資料視窗大小可能會隨著行的變化而變化,舉例如下:
over(order by salary) 按照salary排序進行累計,order by是個預設的開窗函數
over(partition by deptno)按照部門分區
over(order by salary range between 50 preceding and 150 following)
每行對應的資料視窗是之前行幅度值不超過50,之後行幅度值不超過150
over(order by salary rows between 50 preceding and 150 following)
每行對應的資料視窗是之前50行,之後150行
over(order by salary rows between unbounded preceding and unbounded following)
每行對應的資料視窗是從第一行到最後一行,等效:
over(order by salary range between unbounded preceding and unbounded following)

AVG 函數
功能描述:用於計算一個組和資料視窗內運算式的平均值。

--1 所有人員平均工資(每個行的資料視窗為所有行)
SELECT manager_id, last_name, hire_date, salary,
       AVG(salary) OVER () AS c_mavg
FROM employees
order by manager_id,hire_date;

MANAGER_ID    LAST_NAME    HIRE_DATE    SALARY    C_MAVG
100           Kochhar      1989-9-21    17000     6461.68224299065
100           De Haan      1993-1-13    17000     6461.68224299065
100           Raphaely     1994-12-7    11000     6461.68224299065
100           Kaufling     1995-5-1     7900      6461.68224299065
100           Hartstein    1996-2-17    13000     6461.68224299065
100           Weiss        1996-7-18    8000      6461.68224299065
100           Russell      1996-10-1    14000     6461.68224299065
100           Partners     1997-1-5     13500     6461.68224299065
100           Errazuriz    1997-3-10    12000     6461.68224299065
100           Fripp        1997-4-10    8200      6461.68224299065
100           Vollman      1997-10-10   6500      6461.68224299065
100           Cambrault    1999-10-15   11000     6461.68224299065
100           Mourgos      1999-11-16   5800      6461.68224299065
100           Zlotkey      2000-1-29    10500     6461.68224299065
101           Whalen       1987-9-17    4400      6461.68224299065
101           Mavris       1994-6-7     6500      6461.68224299065
101           Higgins      1994-6-7     12000     6461.68224299065
101           Baer         1994-6-7     10000     6461.68224299065
101           Greenberg    1994-8-17    12000     6461.68224299065
...

201           Fay          1997-8-17    6000      6461.68224299065
205           Gietz        1994-6-7     8300      6461.68224299065
              King         1987-6-17    24000     6461.68224299065

--2 相同 manager_id 人員平均工資(每個行的資料視窗為相同 manager_id 所有行)
SELECT manager_id, last_name, hire_date, salary,
       AVG(salary) OVER (PARTITION BY manager_id) AS c_mavg
FROM employees
order by manager_id,hire_date;

MANAGER_ID    LAST_NAME    HIRE_DATE    SALARY    C_MAVG
100           Kochhar      1989-9-21    17000     11100
100           De Haan      1993-1-13    17000     11100
100           Raphaely     1994-12-7    11000     11100
100           Kaufling     1995-5-1     7900      11100
100           Hartstein    1996-2-17    13000     11100
100           Weiss        1996-7-18    8000      11100
100           Russell      1996-10-1    14000     11100
100           Partners     1997-1-5     13500     11100
100           Errazuriz    1997-3-10    12000     11100
100           Fripp        1997-4-10    8200      11100
100           Vollman      1997-10-10   6500      11100
100           Cambrault    1999-10-15   11000     11100
100           Mourgos      1999-11-16   5800      11100
100           Zlotkey      2000-1-29    10500     11100
101           Whalen       1987-9-17    4400      8980
101           Mavris       1994-6-7     6500      8980
101           Higgins      1994-6-7     12000     8980
101           Baer         1994-6-7     10000     8980
101           Greenberg    1994-8-17    12000     8980
...

201           Fay          1997-8-17    6000      6000
205           Gietz        1994-6-7     8300      8300
              King         1987-6-17    24000     24000

--3 按僱傭日期排序,每行資料與前面所有行的平均工資,日期相同的行平均值也相同,此平均值是包含所有該相同日期及其前面所有行的平均值(每個行的資料視窗為小於或等於當前行 hire_date 所有行)
SELECT manager_id, last_name, hire_date, salary,
       AVG(salary) OVER (ORDER BY hire_date) AS c_mavg
FROM employees
order by hire_date;

MANAGER_ID    LAST_NAME    HIRE_DATE    SALARY    C_MAVG
              King         1987-6-17    24000     24000
101           Whalen       1987-9-17    4400      14200
100           Kochhar      1989-9-21    17000     15133.3333333333
102           Hunold       1990-1-3     9000      13600
103           Ernst        1991-5-21    6000      12080
100           De Haan      1993-1-13    17000     12900
101           Mavris       1994-6-7     6500      11420
205           Gietz        1994-6-7     8300      11420
101           Higgins      1994-6-7     12000     11420
101           Baer         1994-6-7     10000     11420
108           Faviet       1994-8-16    9000      11200
101           Greenberg    1994-8-17    12000     11266.6666666667
100           Raphaely     1994-12-7    11000     11246.1538461538
100           Kaufling     1995-5-1     7900      11007.1428571429
114           Khoo         1995-5-18    3100      10480
123           Ladwig       1995-7-14    3600      10050
124           Rajs         1995-10-17   3500      9664.70588235294
121           Sarchand     1996-1-27    4200      9361.11111111111
146           King         1996-1-30   10000      9394.73684210526
123           Bell         1996-2-4     4000      9125
...

147           Banda        2000-4-21    6200      6461.68224299065
148           Kumar        2000-4-21    6100      6461.68224299065

--4 按僱傭日期排序,每行資料與前面所有具有相同 manager_id 行的平均工資,日期相同的行平均值也相同,此平均值是包含所有該相同日期及其前面所有具有相同 manager_id 行的平均值(每個行的資料視窗為與當前行具有相同 manager_id 且小於或等於當前行 hire_date 所有行)
SELECT manager_id, last_name, hire_date, salary,
       AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date) AS c_mavg
FROM employees
order by manager_id,hire_date;

MANAGER_ID    LAST_NAME    HIRE_DATE    SALARY    C_MAVG
100           Kochhar      1989-9-21    17000     17000
100           De Haan      1993-1-13    17000     17000
100           Raphaely     1994-12-7    11000     15000
100           Kaufling     1995-5-1     7900      13225
100           Hartstein    1996-2-17    13000     13180
100           Weiss        1996-7-18    8000      12316.6666666667
100           Russell      1996-10-1    14000     12557.1428571429
100           Partners     1997-1-5     13500     12675
100           Errazuriz    1997-3-10    12000     12600
100           Fripp        1997-4-10    8200      12160
100           Vollman      1997-10-10   6500      11645.4545454545
100           Cambrault    1999-10-15   11000     11591.6666666667
100           Mourgos      1999-11-16   5800      11146.1538461538
100           Zlotkey      2000-1-29    10500     11100
101           Whalen       1987-9-17    4400      4400
101           Mavris       1994-6-7     6500      8225
101           Higgins      1994-6-7     12000     8225
101           Baer         1994-6-7     10000     8225
101           Greenberg    1994-8-17    12000     8980
102           Hunold       1990-1-3     9000      9000
...

201           Fay          1997-8-17    6000      6000
205           Gietz        1994-6-7     8300      8300
              King         1987-6-17    24000     24000

--5 按僱傭日期排序,每行資料與前面一行和後面一行的平均工資(每個行的資料視窗為以 hire_date 排序,當前行的前一行和後一行)
SELECT manager_id, last_name, hire_date, salary,
       AVG(salary) OVER (ORDER BY hire_date ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS c_mavg
FROM employees
order by hire_date;

MANAGER_ID    LAST_NAME    HIRE_DATE    SALARY    C_MAVG
              King         1987-6-17    24000     14200
101           Whalen       1987-9-17    4400      15133.3333333333
100           Kochhar      1989-9-21    17000     10133.3333333333
102           Hunold       1990-1-3     9000      10666.6666666667
103           Ernst        1991-5-21    6000      10666.6666666667
100           De Haan      1993-1-13    17000     9833.33333333333
101           Mavris       1994-6-7     6500      10600
205           Gietz        1994-6-7     8300      8933.33333333333
101           Higgins      1994-6-7     12000     10100
101           Baer         1994-6-7     10000     10333.3333333333
108           Faviet       1994-8-16    9000      10333.3333333333
101           Greenberg    1994-8-17    12000     10666.6666666667
100           Raphaely     1994-12-7    11000     10300
100           Kaufling     1995-5-1     7900      7333.33333333333
114           Khoo         1995-5-18    3100      4866.66666666667
123           Ladwig       1995-7-14    3600      3400
124           Rajs         1995-10-17   3500      3766.66666666667
121           Sarchand     1996-1-27    4200      5900
146           King         1996-1-30   10000      6066.66666666667
123           Bell         1996-2-4     4000      9000
...

147           Banda        2000-4-21    6200      6233.33333333333
148           Kumar        2000-4-21    6100      6150

--6 按僱傭日期排序,每行資料與相同 manager_id 的前面一行和後面一行的平均工資(每個行的資料視窗為以與當前行具有相同 manager_id 的資料的 hire_date 排序,當前行的前一行和後一行)
SELECT manager_id, last_name, hire_date, salary,
AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS c_mavg
FROM employees
order by manager_id,hire_date;

MANAGER_ID    LAST_NAME    HIRE_DATE    SALARY    C_MAVG
100           Kochhar      1989-9-21    17000     17000
100           De Haan      1993-1-13    17000     15000
100           Raphaely     1994-12-7    11000     11966.6666666667
100           Kaufling     1995-5-1     7900      10633.3333333333
100           Hartstein    1996-2-17    13000     9633.33333333333
100           Weiss        1996-7-18    8000      11666.6666666667
100           Russell      1996-10-1    14000     11833.3333333333
100           Partners     1997-1-5     13500     13166.6666666667
100           Errazuriz    1997-3-10    12000     11233.3333333333
100           Fripp        1997-4-10    8200      8900
100           Vollman      1997-10-10   6500      8566.66666666667
100           Cambrault    1999-10-15   11000     7766.66666666667
100           Mourgos      1999-11-16   5800      9100
100           Zlotkey      2000-1-29    10500     8150
101           Whalen       1987-9-17    4400      5450
101           Mavris       1994-6-7     6500      7633.33333333333
101           Higgins      1994-6-7     12000     9500
101           Baer         1994-6-7     10000     11333.3333333333
101           Greenberg    1994-8-17    12000     11000
102           Hunold       1990-1-3     9000      9000
...

201           Fay          1997-8-17    6000      6000
205           Gietz        1994-6-7     8300      8300
              King         1987-6-17    24000     24000 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.