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

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


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

order

by 1, 4 desc

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

from emp

DEPTNO

ENAME

HIREDATE

LATEST SAL

CLARK

2450

09-JUN-1981

KING

5000

17-NOV-1981

MILLER

1300

23-JAN-1982

1300

SMITH

17-DEC-1980

ADAMS

1100

12-JAN-1983

1100

FORD

3000

03-DEC-1981

SCOTT

3000

09-DEC-1982

JONES

2975

02-APR-1981

ALLEN

1600

20-FEB-1981

BLAKE

2850

01-MAY-1981

MARTIN

1250

28-SEP-1981

JAMES

03-DEC-1981

TURNER

1500

08-SEP-1981

WARD

1250

22-FEB-1981

Поскольку 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

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

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



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

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