SELECT
ENAME,
HIREDATE,
SAL,
MAX
(
SAL
)
OVER
(
ORDER BY
HIREDATE,
ENAME
ROWS BETWEEN
UNBOUNDED PRECEDING
AND
1 PRECEDING
) MAX_BEFORE,
MAX
(
SAL
)
OVER
(
ORDER BY
HIREDATE,
ENAME
ROWS BETWEEN
1 FOLLOWING
AND
UNBOUNDED FOLLOWING
) MAX_AFTER
FROM
EMP
ORDER BY
HIREDATE,
ENAME;
引用
ENAME HIREDATE SAL MAX_BEFORE MAX_AFTER
---------- --------- ---------- ---------- ----------
SMITH 17-DEC-80 800 5000
ALLEN 20-FEB-81 1600 800 5000
WARD 22-FEB-81 1250 1600 5000
JONES 02-APR-81 2975 1600 5000
BLAKE 01-MAY-81 2850 2975 5000
CLARK 09-JUN-81 2450 2975 5000
TURNER 08-SEP-81 1500 2975 5000
MARTIN 28-SEP-81 1250 2975 5000
KING 17-NOV-81 5000 2975 3000
FORD 03-DEC-81 3000 5000 3000
JAMES 03-DEC-81 950 5000 3000
MILLER 23-JAN-82 1300 5000 3000
SCOTT 19-APR-87 3000 5000 1100
ADAMS 23-MAY-87 1100 5000
SELECT
ENAME,
SAL,
SUM(SAL) OVER (ORDER BY ENAME ROWS UNBOUNDED PRECEDING) CUMSUM
FROM
EMP;
引用
ENAME SAL CUMSUM
---------- ---------- ----------
ADAMS 1100 1100
ALLEN 1600 2700
BLAKE 2850 5550
CLARK 2450 8000
FORD 3000 11000
JAMES 950 11950
JONES 2975 14925
KING 5000 19925
MARTIN 1250 21175
MILLER 1300 22475
SCOTT 3000 25475
SMITH 800 26275
TURNER 1500 27775
WARD 1250 29025
SELECT
ENAME,
SAL,
AVG(SAL) OVER (ORDER BY SAL ROWS 1 PRECEDING) AVG
FROM
EMP;
引用
ENAME SAL AVG
---------- ---------- ----------
SMITH 800 800
JAMES 950 875
ADAMS 1100 1025
WARD 1250 1175
MARTIN 1250 1250
MILLER 1300 1275
TURNER 1500 1400
ALLEN 1600 1550
CLARK 2450 2025
BLAKE 2850 2650
JONES 2975 2912.5
SCOTT 3000 2987.5
FORD 3000 3000
KING 5000 4000
SELECT
ENAME,
SAL,
SUM(SAL) OVER (ORDER BY SAL ROWS UNBOUNDED PRECEDING) SUMROWS,
SUM(SAL) OVER (ORDER BY SAL RANGE UNBOUNDED PRECEDING) SUMRANGE
FROM
EMP;
引用
ENAME SAL SUMROWS SUMRANGE
---------- ---------- ---------- ----------
SMITH 800 800 800
JAMES 950 1750 1750
ADAMS 1100 2850 2850
WARD 1250 4100 5350
MARTIN 1250 5350 5350
MILLER 1300 6650 6650
TURNER 1500 8150 8150
ALLEN 1600 9750 9750
CLARK 2450 12200 12200
BLAKE 2850 15050 15050
JONES 2975 18025 18025
SCOTT 3000 21025 24025
FORD 3000 24025 24025
KING 5000 29025 29025
Scott和Ford的薪水都是3000。使用RANGE的分析函数是明确的,这两行都返回相同的值,而是用ROWS的分析函数,每一行返回的值不同。
ROWS CURRENT ROW指向唯一的一行,RANGE CURRENT ROW指向排序关键字等于当前行的所有行。
当使用不带有窗口从句的ORDER BY时,支持窗口从句的分析函数的默认的窗口是RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 。
对于日期和时间戳,间隔可以是几天,日到秒(day-to-seconds)或者年到月(year-to-month)的间隔。
SELECT
ENAME,
HIREDATE,
SAL,
AVG(SAL)
OVER
(
ORDER BY
TRUNC(HIREDATE,'MM')
RANGE BETWEEN
INTERVAL '1' MONTH PRECEDING
AND
INTERVAL '1' MONTH PRECEDING
) "PREVIOUS",
AVG(SAL)
OVER
(
ORDER BY
TRUNC(HIREDATE,'MM')
RANGE CURRENT ROW
) "CURRENT",
AVG(SAL)
OVER
(
ORDER BY
TRUNC(HIREDATE,'MM')
RANGE BETWEEN
INTERVAL '1' MONTH FOLLOWING
AND
INTERVAL '1' MONTH FOLLOWING
) "NEXT",
AVG(SAL)
OVER
(
ORDER BY
TRUNC(HIREDATE,'MM')
RANGE BETWEEN
INTERVAL '1' MONTH PRECEDING
AND
INTERVAL '1' MONTH FOLLOWING
) "3MONTHS"
FROM
EMP
ORDER BY
HIREDATE;
引用
ENAME HIREDATE SAL PREVIOUS CURRENT NEXT 3MONTHS
---------- --------- -------- -------- -------- -------- --------
SMITH 17-DEC-80 800 800 800
ALLEN 20-FEB-81 1600 1425 1425
WARD 22-FEB-81 1250 1425 1425
JONES 02-APR-81 2975 2975 2850 2913
BLAKE 01-MAY-81 2850 2975 2850 2450 2758
CLARK 09-JUN-81 2450 2850 2450 2650
TURNER 08-SEP-81 1500 1375 1375
MARTIN 28-SEP-81 1250 1375 1375
KING 17-NOV-81 5000 5000 1975 2983
JAMES 03-DEC-81 950 5000 1975 1300 2563
FORD 03-DEC-81 3000 5000 1975 1300 2563
MILLER 23-JAN-82 1300 1975 1300 1750
SCOTT 19-APR-87 3000 3000 1100 2050
ADAMS 23-MAY-87 1100 3000 1100 2050