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

1 ... 115 116 117 [ 118 ] 119 120 121 ... 219


больше единицы. Ранжирование выполняется согласно размеру заработной платы (это произвольный выбор; использовать значения столбца SAL удобно, но точно так же можно было бы выбрать и столбец EMP-NO). Теперь, когда мы знаем общее количество дубликатов и упорядочили их, расстояние до записи MILLER - это просто общее число дубликатов минус ранг текущей записи плюс один (CNT - RN + 1). Результаты вычисления расстояния и выполнения LEAD OVER показаны ниже:

select deptno,ename,sal,hiredate,

lead(sal)over(partition by deptno

order by hiredate) incorrect,

cnt-rn+1 distance,

lead(sal,cnt-rn+1)over(partition by deptno order by hiredate) correct

from (

select deptno,ename,sal,hiredate,

count(*)over(partition by deptno,hiredate) cnt, row number()over(partition by deptno,hiredate order by sal) rn

from emp where deptno=10 )

DEPTNO

ENAME

HIREDATE

INCORRECT

DISTANCE

CORRECT

CLARK

2450

09-JUN-1981

1000

1000

1000

17-NOV-1981

1500

1300

1500

17-NOV-1981

1600

1300

1600

17-NOV-1981

1700

1300

1700

17-NOV-1981

5000

1300

KING

5000

17-NOV-1981

1300

1300

MILLER

1300

23-JAN-1982

Сейчас можно ясно видеть эффект от передачи в LEAD OVER второго параметра. Столбец INCORRECT (неправильно) представляет значения, возвращаемые LEAD OVER при реализации поведения по умолчанию (сравнения со значением следующей строки). Столбец CORRECT (правильно) представляет значения, возвращаемые LEAD OVER при использовании расстояния для каждого служащего с дублирующимся HIREDATE до строки служащего MILLER. На данном этапе осталось лишь найти разность между значениями CORRECT и SAL для каждой строки, что уже было показано.

Определение начала и конца диапазона последовательных значений

Задача

Данный рецепт является расширением предыдущего и использует то же представление V. Теперь, когда диапазоны последовательных зна-



select

from V

PROJ ID

PROJ START

PROJ END

01-JAN-2005

02-JAN-2005

02-JAN-2005

03-JAN-2005

03-JAN-2005

04-JAN-2005

04-JAN-2005

05-JAN-2005

06-JAN-2005

07-JAN-2005

16-JAN-2005

17-JAN-2005

17-JAN-2005

18-JAN-2005

18-JAN-2005

19-JAN-2005

19-JAN-2005

20-JAN-2005

21-JAN-2005

22-JAN-2005

26-JAN-2005

27-JAN-2005

27-JAN-2005

28-JAN-2005

28-JAN-2005

29-JAN-2005

29-JAN-2005

30-JAN-2005

требуется получить такое результирующее множество:

PROJ GRP PROJ START PROJ END

1 01-JAN-2005 05-JAN-2005

2 06-JAN-2005 07-JAN-2005

3 16-JAN-2005 20-JAN-2005

4 21-JAN-2005 22-JAN-2005

5 26-JAN-2005 30-JAN-2005

Решение

Эта задача несколько сложнее предыдущей. Во-первых, необходимо найти диапазоны. Диапазон строк определяется значениями PROJ START и PROJEND. Чтобы строка считалась последовательной или частью группы, ее значение PROJ START должно быть равным значению PROJ END предыдущей строки. В случае, когда значение PROJ START строки не равно значению PROJ END предыдущей строки и ее значение PROJ END не равно значению PROJ START следующей строки, строка является экземпляром группы, состоящей из одной строки. После определения диапазонов необходимо сгруппировать строки в этих диапазонах (в группы) и возвратить только их начальные и конечные точки.

Рассмотрим первую строку требуемого результирующего множества.

Значение PROJ START - это PROJ START строки PROJ ID 1 пред-

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



PROJ ID

PROJ START

PROJ END

FLAG

01-JAN-2005

02-JAN-2005

02-JAN-2005

03-JAN-2005

03-JAN-2005

04-JAN-2005

04-JAN-2005

05-JAN-2005

06-JAN-2005

07-JAN-2005

16-JAN-2005

17-JAN-2005

17-JAN-2005

18-JAN-2005

18-JAN-2005

19-JAN-2005

19-JAN-2005

20-JAN-2005

21-JAN-2005

22-JAN-2005

26-JAN-2005

27-JAN-2005

27-JAN-2005

28-JAN-2005

28-JAN-2005

29-JAN-2005

29-JAN-2005

30-JAN-2005

При использовании V2 порядок решения такой: сначала находим строки, составляющие множество последовательных значений, затем группируем эти строки, после чего с помощью функций MIN и MAX находим начальную и конечную точки:

1 select proj grp,

2 min(proj start) as proj start,

ставления V, и PROJEND - это PROJEND строки PROJID 4 представления V. Хотя за значением строки PROJ ID 4 не следует никакого последовательного значения, это последнее значение диапазона последовательных значений, таким образом, оно включено в первую группу.

DB2, MySQL, PostgreSQL и SQL Server

В решении для этих платформ используется представление V2, чтобы сделать код более понятным. Представление V2 определено следущим образом:

create view v2 as

select a.*, case when (

select b.proj id

from V b where a.proj start = b.proj end )

is not null then 0 else 1 end as flag from V a

Результирующее множество представления V2:

select * from V2



1 ... 115 116 117 [ 118 ] 119 120 121 ... 219

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