|
Программирование >> Преобразование значений null
заработная плата 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
Не обязательно, чтобы те, кто был принят на работу позже, был принят сразу после рассматриваемого служащего. Следующий (и последний) шаг - выбрать только те строки, в которых значение 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
Заключительный шаг - выбрать только те строки, в которых значение SAL меньше NEXT SAL. Поскольку по умолчанию областью действия LEAD OVER является одна строка, в случае присутствия дубликатов в таблице EMP, в частности, если несколько служащих были приняты на работу в один день, сравниваться будут их SAL. Это может не соответствовать требуемому поведению. Если стоит задача сравнивать SAL каждого служащего с SAL служащего, который был принят на работу
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |