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

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


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

scott@TKYTE816>-select ename, sal, hiredate, hiredate-100windowtop,

2 first value(ename)

3 over (order by hiredate asc

4 range 100 preceding) ename prec,

5 first value(hiredate)

6 over (order by hiredate asc

7 range 100 preceding) hiredate prec

8 from emp

9 order by hiredate asc

10 /

ENAME

HIREDATE

WINDOW TOP ENAME PREC HIREDATE

SMITH

17-DEC-80

08-SEP-80

SMITH

17-DEC-80

ALLEN

1600

20-FEB-81

12-NOV-80

SMITH

17-DEC-80

WARD

1250

22-FEB-81

14-NOV-80

SMITH

17-DEC-80

JONES

2975

02-APR-81

23-DEC-80

ALLEN

20-FEB-81

2850

01-MAY-81

21-JAN-81

ALLEN

20-FEB-81

2450

09-JUN-81

01-MAR-81

JONES

02-APR-81

TURNER

1500

08-SEP-81

31-MAY-81

09-JUN-81

MARTIN

1250

28-SEP-81

20-JUN-81

TURNER

08-SEP-81

KING

5000

17-NOV-81

09-AUG-81

TURNER

08-SEP-81

FORD

3000

03-DEC-81

25-AUG-81

TURNER

08-SEP-81

JAMES

03-DEC-81

25-AUG-81

TURNER

08-SEP-81

MILLER

1300

23-JAN-82

15-OCT-81

KING

17-NOV-81

SCOTT

3000

09-DEC-82

31-AUG-82

SCOTT

09-DEC-82

ADAMS

1100

12-JAN-83

04-OCT-82

SCOTT

09-DEC-82

14 ws selected.

Мы упорядочили один фрагмент по критерию HIREDATE ASC. При этом использовалась аналитическая функция FIRST VALUE поиска первого значения ENAME и первого значения HIREDATE в соответствующем окне. Посмотрев на строку данн1х хя сотрудника CLARK, можно обнаружить, что него значение в столбце HIREDATE - 9 июня 1981 года, 09-JUN-81, а дата за 100 дней до этой соответствует 1 марта 1981 года, 01-MAR-81. Для удобства эта дата помещена в столбец WINDOWTOP. Аналитическая функция затем вычисляется всех строк отсортированного фрагмента, предшествующих строке для сотрудника CLARK и имеющих значение в столбце HIREDATE в диапазоне с 01-MAR-81 по 09-JUN-81. Первое значение ENAME этого окна - JONES. Это имя и выдает аналитическая функция в столбце ENAME PREC.

Упорядочив данные по критерию HIREDATE DESC, мы получим:

scott@TKYTE816> select ename, sal, hiredate, hiredate+100 windowtop,

2 first value(ename)

3 over (order by hiredate desc

4 range 100 preceding) ename prec,

5 first value(hiredate)

6 over (order by hiredate desc

7 range 100 preceding) hiredate prec

8 from emp

9 order by hiredate desc 10 /



1050

Глава 12

ENAME

HIREDATE

WINDOWTOP

ENAME PREC

HIREDATE

ADAMS

1100

12-JAN-83

22-APR-83

ADAMS

12-JAN-83

SCOTT

3000

09-DEC-82

19-MAR-83

ADAMS

12-JAN-83

MILLER

1300

23-JAN-82

03-MAY-82

MILLER

23-JAN-82

FORD

3000

03-DEC-81

13-MAR-82

MILLER

23-JAN-82

JAMES

03-DEC-81

13-MAR-82

MILLER

23-JAN-82

KING

5000

17-NOV-81

25-FEB-82

MILLER

23-JAN-82

MARTIN

1250

28-SEP-81

06-JAN-82

FORD

03-DEC-81

TURNER

1500

08-SEP-81

17-DEC-81

FORD

03-DEC-81

CLARK

2450

09-JUN-81

17-SEP-81

TURNER

08-SEP-81

BLAKE

2850

01-MAY-81

09-AUG-81

CLARK

09-JUN-81

JONES

2975

02-APR-81

ll-JUL-81

CLARK

09-JUN-81

WARD

1250

22-FEB-81

02-JUN-81

BLAKE

01-МАУ-81

ALLEN

1600

20-FEB-81

31-MAY-81

BLAKE

01-MAY-81

SMITH

17-DEC-80

27-MAR-81

WARD

22-FEB-81

14 rows selected.

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

Иногда достаточно сложно понять, какие значения будут входить в диапазон. Я считаю использование функции FIRST VALUE удобным методом, помогающим увидеть диапазоны окна и проверить, корректно ли установлены параметры. Теперь, представив диапазоны окон, мы используем их для в1числения чего-то более существенного. Пусть необходимо выбрать зарплату каждого сотрудника и среднюю зарплату всех принятых на работу в течение 100 преды1дущих дней, а также среднюю зарплату всех принятых на работу в течение 100 следующих дней. Соответствующий запрос будет выглядеть так:

scott@TKYTE816> select ename, hiredate, sal.

avg(sal)

over (order by hiredate asc avg sal 100 days before,

avg(sal)

over (order by hiredate desc avg sal 100 days after from emp

range 100 preceding)

range 100 preceding)

order

ENAME

HIREDATE

AVG SAL 100 DAYS BEPORE

AVG SAL 100 DAYS AFTER

SMITH

17-DEC-80

800.00

800.00

1216.67

ALLEN

20-FEB-81

1600.00

1200.00

2168.75

WARD

22-FEB-81

1250.00

1216.67

2358.33

JONES

02-APR-81

2975.00

1941.67

2758.33

BLAKE

01-MAY-81

2850.00

2168.75

2650.00

CLARK

09-JUN-81

2450.00

2758.33

1975.00

TURNER

08-SEP-81

1500.00

1975.00

2340.00



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

MARTIN

28-SEP-81

1250.00

1375.00

2550.00

KING

17-NOV-81

5000.00

2583.33

2562.50

JAMES

03-DEC-81

950.00

2340.00

1750.00

FORD

03-DEC-81

3000.00

2340.00

1750.00

MILLER

23-JAN-82

1300.00

2562.50

1300.00

SCOTT

09-DEC-82

3000.00

3000.00

2050.00

ADAMS

12-JAN-83

1100.00

2050.00

1100.00

14 rows selected.

Если теперь снова обратиться к строке для сотрудника CLARK, то, поскольку мы уже понимаем, какое окно в группе будет с ней связано, легко убедиться, что средняя зарплата (2758,33) равна (2450+2850+2975)/3. Это средняя зарплата для строки CLARK и строк, предшествующих CLARK (это строки для сотрудников JONES и BLAKE) при упорядочении данных по возрастанию. С другой стороны, средняя зарплата 1975,00 равна (2450+1500)/2. Это средняя зарплата для строки CLARK и строк, предшествующих CLARK при упорядочении данных по убыванию. С помощью этого запроса можно одновременно вычислить среднюю зарплату для сотрудников, принятых на работу за 100 дней до и за 100 дней после сотрудника CLARK.

Окна диапазона можно задавать только по данным типа NUMBER или DATE, поскольку нельзя добавить или вычесть N единиц из значения типа VARCHAR2. Еще одно ограничение для таких окон состоит в том, что в конструкции ORDER BY может быть только один столбец - диапазоны по природе своей одномерны. Нельзя задать диапазон в N-мерном пространстве.

Окна строк

Окна срок задаются в физических единицах, строках. Перепишем вступительный пример из предыдущего раздела, задав окно строк:

count (*) over (order by x ;WS 5 preceding)

Это окно будет включать до 6 строк: текущую и пять предыдущих (порядок определяется конструкцией ORDER BY). Для окон по строкам нет ограничений, присущих окнам по диапазону; данные могут быть любого типа и упорядочивать можно по любому количеству столбцов. Вот пример, сходный с рассмотренным ранее:

scott@TKYTE816> select ename, sal, hiredate,

2 first value(ename)

3 over (order by hiredate asc

4 rows 5 preceding) ename prec,

5 first value(hiredate)

6 over (order by hiredate asc

7 rows 5 preceding) hiredate prec

8 from emp

9 order by hiredate asc 10 /

ENAME

SAL HIREDATE ENAME PREC HIREDATE

SMITH 800.00 17-DEC-80 SMITH 17-DEC-80

ALLEN 1600.00 20-FEB-81 SMITH 17-DEC-80 WARD 1250.00 22-EEB-81 SMITH 17-DEC-80



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

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