|
Программирование >> Преобразование значений null
MySQL и PostgreSQL Используем скалярный подзапрос с двумя уровнями вложенности. Сначала находим для всех отделов HIREDATE служащего, принятого на работу последним. Затем используем агрегатную функцию MAX (на случай дублирования значений), чтобы выбрать значение SAL каждого такого служащего: I select e.deptno, 2 e.ename, 3 e.sal, 4 e.hiredate, 5 (select max(d.sal) 6 from emp d 7 where d.deptno = e.deptno 8 and d.hiredate = 9 (select max(f.hiredate) 10 from emp f II where f.deptno = e.deptno)) as latest sal 12 from emp e 13 order by 1, 4 desc Oracle Используем оконную функцию MAX OVER, чтобы получить наибольшее значение SAL для каждого DEPTNO. Применяя в конструкции KEEP функции DENSE RANK и LAST и при этом упорядочивая по HIREDATE, возвращаем наибольшее значение SAL для самой поздней даты HIREDATE в заданном DEPTNO: 1 select deptno, 2 ename, 3 sal, 4 hiredate, 5 max(sal) 6 keep(dense rank last order by hiredate) 7 over(partition by deptno) latest sal 8 from emp 9 order by 1, 4 desc Обсуждение DB2 и SQL Server Первый шаг - использовать оконную функцию MAX OVER в выражении CASE, чтобы найти в каждом отделе служащего, который был принят на работу самым последним или позже всех. Если значение HIRE-DATE служащего совпадает со значением, возвращенным MAX OVER, с помощью выражения CASE возвращаем значение SAL этого служащего; в противном случае возвращаем 0. Результаты показаны ниже: select deptno, ename, sal, hiredate, case when hiredate = max(hiredate)over(partition by deptno) then sal else 0 end latest sal
Поскольку LATEST SAL будет содержать 0 или SAL служащих, принятых на работу последними, приведенный выше запрос можно поместить во вложенный запрос и опять применить MAX OVER, но на этот раз, чтобы получить наибольшее отличное от нуля значение LATEST SAL для каждого DEPTNO: select deptno, ename, sal, hiredate, max(latest sal)over(partition by deptno) latest sal from ( select deptno, ename, sal, hiredate, case when hiredate = max(hiredate)over(partition by deptno) then sal else 0 end latest sal from emp ) x order by 1, 4 desc DEPTNO ENAME SAL HIREDATE LATEST SAL
MySQL и PostgreSQL Первый шаг - использовать скалярный подзапрос, чтобы найти для каждого отдела HIREDATE служащего, принятого на работу самым последним: select e.deptno, e.ename, e.sal, e.hiredate, (select max(f.hiredate) from emp f where f.deptno = e.deptno) as last hire from emp e order by 1, 4 desc DEPTNO ENAME SAL HIREDATE LAST HIRE 10 MILLER 10 KING 10 CLARK 20 ADAMS 1300 23-JAN-1982 23-JAN-1982 5000 17-NOV-1981 23-JAN-1982 2450 09-JUN-1981 23-JAN-1982 1100 12-JAN-1983 12-JAN-1983
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |