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

1 ... 125 126 127 [ 128 ] 129 130 131 ... 219


ENAME

HIREDATE

SMITH

17-DEC-80

ALLEN

1600

20-FEB-81

WARD

1250

22-FEB-81

JONES

2975

02-APR-81

BLAKE

2850

01-MAY-81

CLARK

2450

09-JUN-81

TURNER

1500

08-SEP-81

MARTIN

1250

28-SEP-81

KING

5000

17-NOV-81

JAMES

03-DEC-81

FORD

3000

03-DEC-81

MILLER

1300

23-JAN-82

SCOTT

3000

09-DEC-82

ADAMS

1100

12-JAN-83

заработная плата SMITH, WARD, MARTIN, JAMES и MILLER меньше, чем человека, принятого сразу после каждого из них, т. е. запрос должен выбрать записи этих служащих.

Решение

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

DB2, MySQL, PostgreSQL и SQL Server

С помощью подзапросов определите для каждого служащего:

Дату приема на работу следующего служащего, имеющего более высокую заработную плату.

Дату приема на работу следующего служащего. Если эти две даты совпадают, мы нашли то, что искали:

1 select ename, sal, hiredate

2 from (

3 select a.ename, a.sal, a.hiredate,

4 (select min(hiredate) from emp b

5 where b.hiredate > a.hiredate

6 and b.sal > a.sal ) as next sal grtr,

7 (select min(hiredate) from emp b

8 where b.hiredate > a.hiredate) as next hire

Сбор информации из последующих строк Задача

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



10 11

Oracle

from emp a ) x

where next sal grtr = next hire

С помощью оконной функции LEAD OVER можно получить заработную плату служащего, принятого на работу следующим после рассматриваемого служащего. Затем остается просто сравнить их заработные платы:

1 select ename, sal, hiredate

2 from (

3 select ename, sal, hiredate,

4 lead(sal)over(order by hiredate) next sal

5 from emp

7 where sal < next sal

Обсуждение

DB2, MySQL, PostgreSQL и SQL Server

Для каждого служащего скалярные подзапросы возвращают значение HIREDATE служащего, принятого на работу сразу после него, и HIRE-DATE первого служащего из тех, кто был принят на работу позже, но зарабатывает больше рассматриваемого служащего. Рассмотрим исходные данные:

select a.ename, a.sal, a.hiredate,

(select min(hiredate) from emp b

where b.hiredate > a.hiredate

and b.sal > a.sal ) as next sal grtr,

(select min(hiredate) from emp b

where b.hiredate > a.hiredate) as next hire from emp a

ENAME

HIREDATE

NEXT SAL GRTR

NEXT HIRE

SMITH

17-DEC-80

20-FEB-81

20-FEB-81

ALLEN

1600

20-FEB-81

02-APR-81

22-FEB-81

WARD

1250

22-FEB-81

02-APR-81

02-APR-81

JONES

2975

02-APR-81

17-NOV-81

01-MAY-81

MARTIN

1250

28-SEP-81

17-NOV-81

17-NOV-81

BLAKE

2850

01-MAY-81

17-NOV-81

09-JUN-81

CLARK

2450

09-JUN-81

17-NOV-81

08-SEP-81

SCOTT

3000

09-DEC-82

12-JAN-83

KING

5000

17-NOV-81

03-DEC-81

TURNER

1500

08-SEP-81

17-NOV-81

28-SEP-81

ADAMS

1100

12-JAN-83

JAMES

03-DEC-81

23-JAN-82

23-JAN-82

FORD

3000

03-DEC-81

23-JAN-82

MILLER

1300

23-JAN-82

09-DEC-82

09-DEC-82



Не обязательно, чтобы те, кто был принят на работу позже, был принят сразу после рассматриваемого служащего. Следующий (и последний) шаг - выбрать только те строки, в которых значение NEXT SAL GRTR (наименьшее значение HIREDATE среди служащих, зарабатывающих больше рассматриваемого служащего) равно NEXT HI-RE (ближайшее последующее значение HIREDATE относительно HI-REDATE текущего служащего).

Oracle

Оконная функция идеально подходит для решения задач такого типа. С ее использованием запрос становится не только более понятным, чем решения для других продуктов, но LEAD OVER также обеспечивает большую гибкость, потому что может принимать аргумент, определяющий, на сколько строк вперед она должна заглянуть (по умолчанию аргумент равен 1). Возможность перепрыгивать через несколько строк важна в случае присутствия дублирующихся значений в столбце, по которому осуществляется упорядочивание.

Следующий пример показывает, как просто с помощью LEAD OVER получить заработную плату служащего, принятого на работу следующим :

select ename, sal, hiredate,

lead(sal)over(order by hiredate) next sal from emp

ENAME

HIREDATE

NEXT SAL

SMITH

17-DEC-80

1600

ALLEN

1600

20-FEB-81

1250

WARD

1250

22-FEB-81

2975

JONES

2975

02-APR-81

2850

BLAKE

2850

01-MAY-81

2450

CLARK

2450

09-JUN-81

1500

TURNER

1500

08-SEP-81

1250

MARTIN

1250

28-SEP-81

5000

KING

5000

17-NOV-81

JAMES

03-DEC-81

3000

FORD

3000

03-DEC-81

1300

MILLER

1300

23-JAN-82

3000

SCOTT

3000

09-DEC-82

1100

ADAMS

1100

12-JAN-83

Заключительный шаг - выбрать только те строки, в которых значение SAL меньше NEXT SAL. Поскольку по умолчанию областью действия LEAD OVER является одна строка, в случае присутствия дубликатов в таблице EMP, в частности, если несколько служащих были приняты на работу в один день, сравниваться будут их SAL. Это может не соответствовать требуемому поведению. Если стоит задача сравнивать SAL каждого служащего с SAL служащего, который был принят на работу



1 ... 125 126 127 [ 128 ] 129 130 131 ... 219

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