запрос (интервалы дат)

blondinkaT
Дата: 14.11.2009 22:00:44
Есть интервалы дат в таблице

01.01.09 01.03.09
02.03.09 01.04.09
02.04.09 01.05.09
03.05.09 15.05.09

надо получить
01.01.09 01.05.09
03.05.09 15.05.09
(типа т.к. первые три интервала непрерывались, заканчивался один сразу начинался другой, то объединились в один, а четвертый - начался не сразу, а спустя сколько-то дней - то он без изменений)
Владимир Саныч
Дата: 14.11.2009 22:46:40
http://sql.ru/forum/actualthread.aspx?tid=116495&pg=-1#902102
Не совсем то, но может помочь.
mds_world
Дата: 14.11.2009 23:34:20
Владимир Саныч
http://sql.ru/forum/actualthread.aspx?tid=116495&pg=-1#902102
Не совсем то, но может помочь.

Как раз то, что надо, если предварительно таблицу автора связать с таблицей-календарем (содержащей последовательные даты в нужном диапазоне) вот таким запросом
SELECT Kalendar.Дата AS id 
FROM Таблица INNER JOIN Kalendar ON (Таблица.Начало<= Kalendar.Дата) AND (Таблица.Окончание>= Kalendar.Дата) 
ORDER BY Kalendar.Дата
И уже этот запрос подставлять в запрос, находящий непрерывные интервалы
ё
Дата: 15.11.2009 00:10:03
...страшненько, конешна
SELECT MIN(c.s) As start, c.f As finish
FROM 
(SELECT T.Поле1 As s, 
  (SELECT MIN(b.d) FROM
    (SELECT a.d
     FROM (  
       SELECT DateAdd('d', CLng(D3.digit & D2.digit & D1.digit & D0.digit), #01/01/2000#) AS d
       FROM Digits D0, Digits D1,Digits D2,Digits D3
           ) a
     WHERE NOT EXISTS (SELECT 1 FROM T WHERE a.d BETWEEN T.Поле1 AND T.Поле2)) b
   WHERE T.Поле2 < b.d)-1 As f
 FROM T) c
GROUP BY c.f
запрос Digits - здесь
T - таблица ТС
работать будет для дат из диапазона - 01/01/2000 - 18/05/2027 (10000 дней)

...чесно говоря самому интересно - можно ли сделать проще?
Taper
Дата: 15.11.2009 03:53:34
ё
...страшненько, конешна...

Лишь бы работало
qwrqwr
Дата: 15.11.2009 11:36:51
ё

...чесно говоря самому интересно - можно ли сделать проще?
вот так попроще будет (без дополнительных календарно-числовых таблиц):
SELECT begs.beg AS d1, 
       Min(ends.end) AS d2
  FROM (SELECT tt.beg
          FROM T AS tt
         WHERE Not Exists (select 1 
                             from T as x 
                            where x.end+1 >= tt.beg and x.beg < tt.beg)
       ) AS begs 
 INNER JOIN 
       (SELECT tt.end
          FROM T AS tt
         WHERE Not Exists (select 1 
                             from T as x 
                            where x.beg-1 <= tt.end and x.end > tt.end)
       ) AS ends 
    ON begs.beg < ends.end
 GROUP BY begs.beg;
PS: особенно порадовала трактовка "непрерывающихся интервалов" как интервалов, между которыми не больше 1 дня
-=-
Дата: 15.11.2009 11:38:14
Можно без привлечения дополнительных таблицы календаря и запроса Digits
SELECT Max(Q1.d) As p_beg, Q2.d As p_end
FROM Q AS Q1 INNER JOIN Q AS Q2 ON Q1.d<Q2.d
GROUP BY Q2.d
HAVING Count(*) Mod 2=1
где запрос Q
SELECT T1.dat_beg As d  
FROM T As T1 LEFT JOIN T As T2 ON T1.dat_beg=T2.dat_end+1 
WHERE T2.dat_beg Is Null
UNION ALL 
SELECT T1.dat_end 
FROM T As T1 LEFT JOIN T As T2 ON T1.dat_end=T2.dat_beg-1 
WHERE T2.dat_end Is Null
здесь T-исходная таблица с полями dat_beg, dat_end
mds_world
Дата: 15.11.2009 12:18:14
-=-,
запрос интересный и работает быстро, но не учитывает (пропускает) ситуацию когда непрерывный диапазон составляет всего одни сутки, типа
Исходная таблица
dat_beg dat_end
01.01.2009 01.01.2009
Результат - пусто

А два однодневных диапазона, стояших рядом, записывает как один, продолжительностью 2 дня. И мне это кажется неверным, непрерывный диапазон записывается полями dat_beg, dat_end в одной записи
Исходная таблица
dat_beg dat_end
01.01.2009 01.01.2009
02.01.2009 02.01.2009

Результат
p_beg p_end
16.12.2009 17.12.2009


- =-, если вы исправите запрос, это будет очень полезно
mds_world
Дата: 15.11.2009 12:21:56
Извиняюсь, с последним результат промахнулся. Надо так
Результат
p_beg p_end
01.01.2009 02.01.2009
ё
Дата: 15.11.2009 12:29:25
qwrqwr, -=-,

красиво!
респект

наглядный пример, к чему приводит поиск "лёгких" путей (это я о себе)))
-есть запрос на поиск интервалов/дырок по одному полю? - есть!
значит надо исх.задачу привести к этой (поиску дыр) )))


-=-

один ньюанс
если в данных есть "пересекающиеся" диапазоны (возможно у ТС - этого нет, но всё же),
то в результате - немного не то
типа этого (4-ая строка)
beg end
01.01.2009 01.03.2009
02.03.2009 01.04.2009
02.04.2009 01.05.2009
31.03.2009 01.04.2009
03.05.2009 15.05.2009

результат
p_beg p_end
01.01.2009 31.03.2009
01.05.2009 03.05.2009


..гм,
пока писал, похоже уважаемый mds_world это уже Вам сказал...