Программирование >>  Oracle 

1 ... 212 213 214 [ 215 ] 216 217 218 ... 469


1052

Глава 12

JONES

2975.00

02-APR-81

SMITH

17-DEC-80

BLAKE

2850.00

01-MAY-81

SMITH

17-DEC-80

CLARK

2450.00 09-JUN-81

SMITH

17-DEC-80

TURNER

1500.00

08-SEP-81

ALLEN

20-FEB-81

MARTIN

1250.00

28-SEP-81

WARD

22-FEB-81

KING

5000.00

17-NOV-81

JONES

02-APR-81

JAMES

950.00

03-DEC-81

BLAKE

01-MAY-81

FORD

3000.00

03-DEC-81

CLARK

09-JUN-81

MILLER

1300.00

23-JAN-82

TURNER

08-SEP-81

SCOTT

3000.00

09-DEC-82

MARTIN

28-SEP-81

ADAMS

1100.00

12-JAN-83

KING

17-NOV-81

14 rows

selected.

Взглянув на строку для сотрудника CLARK, можно увидеть, что первой в окне ROWS 5 PRECEDING следует строка для сотрудника SMITH - она просто пятая перед строкой для CLARK в соответствии с заданным порядком. Строка для сотрудника SMITH будет первой в окне и для всех предыдущих строк (для BLAKE, JONES и т.д.). Дело в том, что строка для SMITH - первая в данной группе (она будет первой и для самой себя). При сортировке группы по возрастанию окна изменяются:

scott@TKYTE816> select ename, sal, hiredate.

2 first value(ename)

3 over (order by hiredate

4 rows 5 preceding)

5 first value(hiredate)

6 over (order by hiredate

7 rows 5 preceding)

8 from emp

9 order by hiredate desc 10 /

desc

ename prec,

desc

hiredate prec

ENAME

HIREDATE

ENAME PREC

HIREDATE

ADAMS

1100.00

12-JAN-83

ADAMS

12-JAN-83

SCOTT

3000.00

09-DEC-82

ADAMS

12-JAN-83

MILLER

1300.00 23-JAN-82 ADAMS

12-JAN-83

JAMES

950.00

03-DEC-81

ADAMS

12-JAN-83

FORD

3000.00

03-DEC-81

ADAMS

12-JAN-83

KING

5000.00

17-NOV-81

ADAMS

12-JAN-83

MARTIN

1250.00

28-SEP-81

SCOTT

09-DEC-82

TURNER

1500.00

08-SEP-81

MILLER

23-JAN-82

CLARK

2450.00 09-JUN-81 JAMES

03-DEC-81

BLAKE

2850.00

01-MAY-81

FORD

03-DEC-81

JONES

2975.00

02-APR-81

KING

17-NOV-81

WARD

1250.00

22-FEB-81

MARTIN

28-SEP-81

ALLEN

1600.00

20-FEB-81

TURNER

08-SEP-81

SMITH

800.00

17-DEC-80

CLARK

09-JUN-81

14 rows selected.

Теперь первое значение для набора из 5 строк, предшествующих в группе строке для сотрудника CLARK, - строка для сотрудника JAMES. Теперь можно вычислить сред-



Аналитические функции

нюю зарплату для указанного сотрудника и пяти принятых на работу до него и после него:

scott@TKYTE816> select ename, hiredate, sal,

2 avg(sal)

3 over (order by hiredate asc rows 5 preceding) avg 5 before,

4 count(*)

5 over (order by hiredate asc rows 5 preceding) obs before,

6 avg(sal)

7 over (order by hiredate desc rows 5 preceding) avg 5 after,

8 count(*)

9 over (order by hiredate desc rows 5 preceding) obs after

10 from emp

11 order by hiredate

12 /

ENAME

HIREDATE

AVG 5 BEFORE

OBS BEPOPE

AVG 5 APTER

OBS AFTER

SMITH

17-DEC-80

800.00

800.00

1.00

1987.50

6.00

ALLEN

20-FEB-81

1600.00

1200.00

2.00

2104.17

6.00

WARD

22-FEB-81

1250.00

1216.67

3.00

2045.83

6.00

JONES

02-APR-81

2975.00

1656.25

4.00

2670.83

6.00

BLAKE

01-MAY-81

2850.00

1895.00

5.00

2675.00

6.00

09-JUN-81

2450.00

1987.50

6.00

2358.33

6.00

TURNER

08-SEP-81

1500.00

2104.17

6.00

2166.67

6.00

MARTIN

28-SEP-81

1250.00

2045.83

6.00

2416.67

6.00

KING

17-NOV-81

5000.00

2670.83

6.00

2391.67

6.00

JAMES

03-DEC-81

950.00

2333.33

6.00

1587.50

4.00

FORD

03-DEC-81

3000.00

2358.33

6.00

1870.00

5.00

MILLER

23-JAN-82

1300.00

2166.67

6.00

1800.00

3.00

SCOTT

09-DEC-82

3000.00

2416.67

6.00

2050.00

2.00

ADAMS

12-JAN-83

1100.00

2391.67

6.00

1100.00

1.00

14 rows

selected.

Обратите внимание, что я выбирал также значение COUNT(*). Это позволяет понять, по какому количеству строк б1ло вычислено среднее значение. Можно явно увидеть, что для вычисления средней зарплаты сотрудников, принятых до сотрудника ALLEN, использовалось только 2 записи, а для вычисления средней зарплаты сотрудников, нанятых после него, - 6. В том месте группы, где находится строка для сотрудника ALLEN, есть только 1 пред]дущая запись, а при вычислении аналитической функции используются все имеющиеся строки.

Задание окон

Теперь, понимая различие между окнами диапазонов и окнами строк, можно изучать способы задания окон.

В простейшем случае, окно задается с помощью одной из трех следующих взаимоисключающих конструкций.

UNBOUNDED PRECEDING. Окно начинается с первой строки текущей группы и заканчивается текущей обрабатываемой строкой.



1054

Глава 12

CURRENT ROW. Окно начинается (и заканчивается) текущей строкой.

Числовое в1ражение PRECEDING. Окно начинается со строки за числовое вы-ражение строк до текущей, если оно задается по строкам, или со строки, меньшей по значению столбца, упомянутого в конструкции ORDER BY, не более чем на числовое в1ражение, если оно задается по диапазону.

Окно CURRENT ROW в простейшем виде, вероятно, никогда не используется, поскольку ограничивает применение аналитической функции одной текущей строкой, а для этого аналитические функции не нужны. В более сложном случае для окна задается также конструкция BETWEEN. В ней CURRENT ROW можно указывать в качестве начальной или конечной строки окна. Начальную и конечную строку окна в конструкции BETWEEN можно задавать с использованием любой из перечисленн1х выше конструкций и еще одной, дополнительной:

Числовое в1ражение FOLLOWING. Окно заканчивается (или начинается) со строки, через числовое в1ражение строк после текущей, если оно задается по строкам, или со строки, большей по значению столбца, упомянутого в конструкции ORDER BY, не более чем на числовое в1ражение, если оно задается по диапазону.

Рассмотрим ряд примеров такого задания окон:

scott@TKYTE816> select deptno, ename, hiredate.

9 10

count(*) over (partition by deptno

order by hiredate nulls first range 100 preceding) cnt range,

count(*) over (partition by deptno

order by hiredate nulls first rows 2 preceding) cnt rows

from emp

where deptno in (10, 20) order by deptno, hiredate

DEPTNO ENAME

HIREDATE

CNT RANGE

CNT ROWS

10 CLARK

09-JUN-81

KING

17-NOV-81

MILLER

23-JAN-82

2 0 SMITH

17-DEC-80

JONES

02-APR-81

FORD

03-DEC-81

SCOTT

09-DEC-82

ADAMS

12-JAN-83

8 rows selected.

Как видите, окно RANGE 100 PRECEDING содержит только строки текущего фрагмента, предшествующие текущей строке, и те, значение которых HIREDATE находится в диапазоне HIREDATE-100 и HIREDATE относительно текущей. В данном случае таких строк всегда 1 или 2, т.е. интервал между приемом людей на работу обычно пре-



1 ... 212 213 214 [ 215 ] 216 217 218 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика