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

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


Работа с диапазонами данных

Данная глава рассказывает об обыденных запросах с участием диапазонов. В повседневной жизни диапазоны встречаются всюду. Например, работа над проектом занимает определенный диапазон времени. В SQL часто возникает необходимость поиска диапазонов, или формирования диапазонов, или любой другой обработки диапазонов данных. Представленные здесь запросы немного сложнее обсуждавшихся в предыдущих главах, но они так же часто используются. Овладев ими в полной мере, вы почувствуете настоящую мощь SQL.

Поиск диапазона последовательных значений Задача

Требуется найти строки, представляющие ряд последовательных проектов. Рассмотрим следующее представление V, содержащее данные о проекте и даты его начала и окончания:

select * from V

PROJ ID PROJ START PROJ END

1 01-JAN-2005 02-JAN-2005

2 02-JAN-2005 03-JAN-2005

3 03-JAN-2005 04-JAN-2005

4 04-JAN-2005 05-JAN-2005

5 06-JAN-2005 07-JAN-2005

6 16-JAN-2005 17-JAN-2005

7 17-JAN-2005 18-JAN-2005

8 18-JAN-2005 19-JAN-2005

9 19-JAN-2005 20-JAN-2005 10 21-JAN-2005 22-JAN-2005



11 26-JAN-2005 27-JAN-2005

12 27-JAN-2005 28-JAN-2005

13 28-JAN-2005 29-JAN-2005

14 29-JAN-2005 30-JAN-2005

Для всех строк, кроме первой, значение PROJ START (начало проекта) должно быть равным значению PROJ END (конец проекта) предыдущей строки ( предыдущая строка для текущей строки определяется как PROJID - 1). Рассмотрев первые пять строк представления V, можно заметить, что проекты с PROJ ID от 1 до 3 являются частью одной группы , так как для каждого из них PROJ END равняется PROJ START следующей строки. Поскольку требуется найти диапазон дат последовательно выполняющихся проектов, должны быть выбраны все строки, в которых значение PROJ END текущей строки равно значению PROJSTART следующей строки. Если бы представление V состояло только из первых пяти строк, были бы выбраны лишь первые три из них. Необходимо получить следущее результирующее множество (используя все 14 строк представления 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

16-JAN-2005

17-JAN-2005

17-JAN-2005

18-JAN-2005

18-JAN-2005

19-JAN-2005

26-JAN-2005

27-JAN-2005

27-JAN-2005

28-JAN-2005

28-JAN-2005

29-JAN-2005

Строки с PROJID 4, 5, 9, 10 и 14 не вошли в это результирующее множество, потому что их PROJ END не совпадает с PROJ START последующих строк.

Решение

DB2, MySQL, PostgreSQL и SQL Server

Для выявления строк с последовательными значениями используйте рефлексивное объединение:

1 select v1.proj id,

2 v1.proj start,

3 v1.proj end

4 from V v1, V v2

5 where v1.proj end = v2.proj start

Oracle

Предыдущее решение подходит и для Oracle. Привожу альтернативное решение, в котором для проверки значения BEGIN DATE сле-



дующей строки используется оконная функция LEAD OVER, что устраняет необходимость в рефлексивном объединении:

1 select proj id,proj start,proj end

2 from (

3 select proj id,proj start,proj end,

4 lead(proj start)over(order by proj id) next proj start

5 from V

7 where next proj start = proj end

Обсуждение

DB2, MySQL, PostgreSQL и SQL Server

Благодаря объединению представления с самим собой (рефлексивному объединению) каждую строку можно сравнить со всеми остальными строками. Рассмотрим часть результирующего множества для строк со значениями ID 1 и 4:

select v1.proj id as v1 id, v1.proj end as v1 end, v2.proj start as v2 begin,

v2.proj id

as v2 id

from v v1, v v2

where v1.proj id

in ( 1,4 )

V1 ID

V1 END

V2 BEGIN

V2 ID

02-JAN-2005

01-JAN-2005

02-JAN-2005

02-JAN-2005

02-JAN-2005

03-JAN-2005

02-JAN-2005

04-JAN-2005

02-JAN-2005

06-JAN-2005

02-JAN-2005

16-JAN-2005

02-JAN-2005

17-JAN-2005

02-JAN-2005

18-JAN-2005

02-JAN-2005

19-JAN-2005

02-JAN-2005

21-JAN-2005

02-JAN-2005

26-JAN-2005

02-JAN-2005

27-JAN-2005

02-JAN-2005

28-JAN-2005

02-JAN-2005

29-JAN-2005

05-JAN-2005

01-JAN-2005

05-JAN-2005

02-JAN-2005

05-JAN-2005

03-JAN-2005

05-JAN-2005

04-JAN-2005

05-JAN-2005

06-JAN-2005

05-JAN-2005

16-JAN-2005

05-JAN-2005

17-JAN-2005

05-JAN-2005

18-JAN-2005

05-JAN-2005

19-JAN-2005

05-JAN-2005

21-JAN-2005



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

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