Программирование >>  Преобразование значений null 

1 ... 130 131 132 [ 133 ] 134 135 136 ... 219


SCOTT

3000

09-DEC-1982

12-JAN-1983

FORD

3000

03-DEC-1981

12-JAN-1983

JONES

2975

02-APR-1981

12-JAN-1983

SMITH

17-DEC-1980

12-JAN-1983

JAMES

03-DEC-1981

03-DEC-1981

MARTIN

1250

28-SEP-1981

03-DEC-1981

TURNER

1500

08-SEP-1981

03-DEC-1981

BLAKE

2850

01-MAY-1981

03-DEC-1981

WARD

1250

22-FEB-1981

03-DEC-1981

ALLEN

1600

20-FEB-1981

03-DEC-1981

Следующий шаг - найти в каждом отделе SAL служащих, дата приема на работу которых совпадает с датой LAST HIRE. С помощью агрегатной функции MAX выбираем наибольшее значение SAL (если в один день было нанято несколько служащих):

select e.deptno, e.ename, e.sal, e.hiredate, (select max(d.sal) from emp d where d.deptno = e.deptno and d.hiredate =

(select max(f.hiredate) from emp f

where f.deptno = e.deptno)) as latest sal

from emp e order by 1, 4 desc

DEPTNO

ENAME

HIREDATE

LATEST SAL

MILLER

1300

23-JAN-1982

1300

KING

5000

17-NOV-1981

1300

CLARK

2450

09-JUN-1981

1300

ADAMS

1100

12-JAN-1983

1100

SCOTT

3000

09-DEC-1982

1100

FORD

3000

03-DEC-1981

1100

JONES

2975

02-APR-1981

1100

SMITH

17-DEC-1980

1100

JAMES

03-DEC-1981

MARTIN

1250

28-SEP-1981

TURNER

1500

08-SEP-1981

BLAKE

2850

01-MAY-1981

WARD

1250

22-FEB-1981

ALLEN

1600

20-FEB-1981

Oracle

Пользователям Oracle 8i Database подойдет решение для DB2. Те, кто работает с Oracle 9i Database и более поздними версиями, могут использовать решение, представленное ниже. Ключ к решению для Oracle -



оператор KEEP. Он позволяет ранжировать возвращенный сегмент/ группу строк и работать с первой или последней строкой группы. Рассмотрим решение без KEEP:

select deptno, ename, sal,

hiredate,

max(sal) over(partition by deptno) latest sal

from

order

by 1, 4 desc

DEPTNO

ENAME

HIREDATE

LATEST SAL

MILLER

1300

23-JAN-1982

5000

KING

5000

17-NOV-1981

5000

CLARK

2450

09-JUN-1981

5000

ADAMS

1100

12-JAN-1983

3000

SCOTT

3000

09-DEC-1982

3000

FORD

3000

03-DEC-1981

3000

JONES

2975

02-APR-1981

3000

SMITH

17-DEC-1980

3000

JAMES

03-DEC-1981

2850

MARTIN

1250

28-SEP-1981

2850

TURNER

1500

08-SEP-1981

2850

BLAKE

2850

01-MAY-1981

2850

WARD

1250

22-FEB-1981

2850

ALLEN

1600

20-FEB-1981

2850

Вместо того чтобы возвращать SAL служащего, принятого на работу последним, MAX OVER без KEEP возвращает самую высокую заработную плату для каждого отдела. В данном рецепте в конструкции KEEP задано ORDER BY HIREDATE, что обеспечивает упорядочение заработных плат каждого отдела по HIREDATE. Затем функция DENSE RANK ранжирует все HIREDATE в порядке по возрастанию. Наконец, функция LAST определяет, к какой строке применять агрегатную функцию: к последней строке соответственно рангам, назначенным DENSE RANK. В данном случае агрегатная функция MAX применяется к столбцу SAL для строки с последней датой HIREDATE. По сути, для каждого отдела выбирается значение SAL, соответствующее HIREDATE с наивысшим рангом.

Ранжирование строк для каждого DEPTNO осуществляется по одному столбцу (HIREDATE), а агрегация (MAX) выполняется по другому столбцу (SAL). Эта способность назначать ранги по одной величине и агрегировать по другой очень удобна, поскольку позволяет избежать применения дополнительных объединений и вложенных запросов, как в других решениях. Наконец, применив оператор OVER после KEEP, можно возвратить значение SAL, выбранное KEEP для каждой строки сегмента.



Или можно упорядочить строки по HIREDATE в порядке по убыванию и выбрать первое значение SAL. Сравните два приведенных ниже запроса, в результате их выполнения возвращается одно и то же результирующее множество:

select deptno,

ename, sal,

hiredate, max(sal)

keep(dense rank last order by hiredate) over(partition by deptno) latest sal from emp order by 1, 4 desc

DEPTNO ENAME

SAL HIREDATE

LATEST SAL

MILLER

1300

23-JAN-1982

1300

KING

5000

17-NOV-1981

1300

CLARK

2450

09-JUN-1981

1300

ADAMS

1100

12-JAN-1983

1100

SCOTT

3000

09-DEC-1982

1100

FORD

3000

03-DEC-1981

1100

JONES

2975

02-APR-1981

1100

SMITH

17-DEC-1980

1100

JAMES

03-DEC-1981

MARTIN

1250

28-SEP-1981

TURNER

1500

08-SEP-1981

BLAKE

2850

01-MAY-1981

WARD

1250

22-FEB-1981

ALLEN

1600

20-FEB-1981

select deptno,

ename, sal,

hiredate, max(sal)

keep(dense rank first order by hiredate desc) over(partition by deptno) latest sal

from emp

order by 1, 4 desc

DEPTNO ENAME

SAL HIREDATE

LATEST SAL

MILLER

1300

23-JAN-1982

1300

KING

5000

17-NOV-1981

1300

CLARK

2450

09-JUN-1981

1300

ADAMS

1100

12-JAN-1983

1100

SCOTT

3000

09-DEC-1982

1100

FORD

3000

03-DEC-1981

1100

JONES

2975

02-APR-1981

1100

SMITH

17-DEC-1980

1100



1 ... 130 131 132 [ 133 ] 134 135 136 ... 219

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