2013-10-08 5 views
0

Любой может помочь мне в запросе, который ** объединит интервал данных?
например: Общий выбор:Объединить промежуточные интервалы времени, как?

ВЫБРАТЬ идентификатор, DATE_START, date_end ОТ EVENTO ORDER BY date_start

Я получил это:
pgsql result

от этого:
web agenda

но хотите запрос, вернуть это:

01 - 2013-10-11 08:00:00 2013-10-11 15:00:00
02 - 2013-10-11 16: 00:00 2013-10-11 19:00:00

Большое спасибо!

+1

Можете ли вы разместить свою таблицу данных (с идентификатором, date_start, date_end в заголовке) в форме ** текста **? –

+0

[Это сообщение SO] (http://stackoverflow.com/questions/11653255/sql-merge-date-ranges) дает ответы на очень похожий вопрос. 1-й ответ даже имеет Postgresql SQL Fiddle. –

+0

Вторая строка ожидаемого результата не будет от '16: 00' вместо' 14: 00'? – MatheusOl

ответ

4

Вы также можете попробовать этот запрос (еще раз решение рядом с теми, которые дают PM 77-1 в выше комментарии):

WITH RECURSIVE cte(id, date_start, date_end) AS 
(
    SELECT id, date_start, date_end 
    FROM evento 
    UNION 
    SELECT e.id, 
     least(c.date_start, e.date_start), 
     greatest(c.date_end, e.date_end) 
    FROM cte c 
    JOIN evento e 
    ON e.date_start between c.date_start and c.date_end 
    OR 
    e.date_end between c.date_start and c.date_end 
) 
SELECT distinct date_start, date_end 
FROM (
    SELECT id, 
     min(date_start) date_start, 
     max(date_end) date_end 
    FROM cte 
    GROUP BY id 
) xx 
ORDER BY date_start; 

Демо --->http://www.sqlfiddle.com/#!12/bdf7e/9

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

+0

Вау! Только сейчас я увидел ваш ответ, я не получил никаких предупреждений об этом; ~ Спасибо большое, ваш запрос работает отлично! Я долго пытался это сделать. –

+0

Как вы напишете этот запрос для SQL Server 2008? SQL Server не имеет «наименьших» и «наибольших» функций. – Thracian

+1

@Thracian выражение 'CASE', например' наименьшее (x, y) ', может быть заменено на' случай, когда x y, тогда x else y end' – krokodilko

Смежные вопросы