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

1 ... 109 110 111 [ 112 ] 113 114 115 ... 219


KING

23-JUN-2005

25-JUN-2005

26-JUN-2005

KING

26-JUN-2005

27-JUN-2005

17-JUN-2005

KING

26-JUN-2005

27-JUN-2005

23-JUN-2005

KING

26-JUN-2005

27-JUN-2005

29-JUN-2005

KING

26-JUN-2005

27-JUN-2005

20-JUN-2005

KING

29-JUN-2005

30-JUN-2005

17-JUN-2005

KING

29-JUN-2005

30-JUN-2005

23-JUN-2005

KING

29-JUN-2005

30-JUN-2005

20-JUN-2005

KING

29-JUN-2005

30-JUN-2005

26-JUN-2005

Как видно из приведенного выше результирующего множества, рефлексивное объединение упрощает задачу по выявлению перекрытия дат; теперь остается просто выбрать все строки, в которых B START выпадает между A START и A END. Предикат WHERE в строках 7 и8 решения:

and b.proj start >= a.proj start and b.proj start <= a.proj end

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

Пользователям Oracle доступна оконная функция LEAD OVER, которая позволяет избежать рефлексивного объединения, если один служащий ведет фиксированное число проектов. Использование этой функции может пригодиться, если рефлексивное объединение слишком дорого для конкретного рассматриваемого случая (если рефлексивное объединение требует больше ресурсов, чем сортировка, необходимая для LEAD OVER). Например, рассмотрим альтернативное решение для служащего KING с использованием функции LEAD OVER:

select empno, ename, proj id, proj start, proj end, case

when lead(proj start,1)over(order by proj start)

between proj start and proj end then lead(proj id)over(order by proj start) when lead(proj start,2)over(order by proj start)

between proj start and proj end then lead(proj id)over(order by proj start) when lead(proj start,3)over(order by proj start)

between proj start and proj end then lead(proj id)over(order by proj start) when lead(proj start,4)over(order by proj start)

between proj start and proj end then lead(proj id)over(order by proj start) end is overlap from emp project



where ename = KING

EMPNO ENAME PROJ ID PROJ START PROJ END IS OVERLAP

7839 KING 2 17-JUN-2005 21-JUN-2005 5

7839 KING 5 20-JUN-2005 24-JUN-2005 8

7839 KING 8 23-JUN-2005 25-JUN-2005

7839 KING 11 26-JUN-2005 27-JUN-2005

7839 KING 14 29-JUN-2005 30-JUN-2005

Поскольку для служащего KING количество проектов фиксировано и равно пяти, для сравнения дат всех проектов без рефлексивного объединения можно использовать LEAD OVER. С этого момента формирование результирующего множества не составляет труда. Просто выбираем строки, в которых значение столбца IS OVERLAP (перекрывается) не NULL:

select empno,ename,

project is overlap overlaps project proj id msg

from ( select empno, ename, proj id, proj start, proj end, case

when lead(proj start,1)over(order by proj start)

between proj start and proj end then lead(proj id)over(order by proj start) when lead(proj start,2)over(order by proj start)

between proj start and proj end then lead(proj id)over(order by proj start) when lead(proj start,3)over(order by proj start)

between proj start and proj end then lead(proj id)over(order by proj start) when lead(proj start,4)over(order by proj start)

between proj start and proj end then lead(proj id)over(order by proj start) end is overlap from emp project where ename = KING )

where is overlap is not null

EMPNO ENAME MSG

7839 KING project 5 overlaps project 2 7839 KING project 8 overlaps project 5

Чтобы в решении участвовали все служащие (не только KING), в функции LEAD OVER выполняем сегментирование по ENAME:



select empno,ename,

project is overlap overlaps project proj id msg

from ( select empno, ename, proj id, proj start, proj end, case

when lead(proj start,1)over(partition by ename

order by proj start) between proj start and proj end then lead(proj id)over(partition by ename

order by proj start) when lead(proj start,2)over(partition by ename

order by proj start) between proj start and proj end then lead(proj id)over(partition by ename

order by proj start) when lead(proj start,3)over(partition by ename

order by proj start) between proj start and proj end then lead(proj id)over(partition by ename

order by proj start) when lead(proj start,4)over(partition by ename

order by proj start) between proj start and proj end then lead(proj id)over(partition by ename

order by proj start)

end is overlap from emp project )

where is overlap is not null

EMPNO ENAME MSG

7782 CLARK project 7 overlaps project 4 7782 CLARK project 10 overlaps project 7 7782 CLARK project 13 overlaps project 10 7839 KING project 5 overlaps project 2 7839 KING project 8 overlaps project 5 7934 MILLER project 6 overlaps project 3 7934 MILLER project 12 overlaps project 9



1 ... 109 110 111 [ 112 ] 113 114 115 ... 219

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