PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

postgresql combinant plusieurs périodes en une seule

Hé, je suggérerais d'utiliser le processus suivant :

1- Identifiez quand une ligne est nouvelle, vous donnez donc une valeur de 1 aux valeurs qui ne se chevauchent pas (CTE b)

2- Séquencez ensemble les rangs qui se chevauchent avec les autres. De cette façon, vous pouvez voir avoir un identifiant commun qui vous permettra de MAX et MIN begat et endat (CTE c)

3- Pour chaque séquence, donnez le MIN de begat et le MAX de endat pour avoir vos valeurs finales

WITH a AS (
select '2017-09-16 07:12:57' as begat,'2017-09-16 11:30:22' as endat
union 
select '2017-09-18 17:05:21' ,'2017-09-19 13:18:01'
union 
select '2017-09-19 15:34:40' ,'2017-09-22 13:29:37'
union 
select '2017-09-22 12:24:16' ,'2017-09-22 13:18:29' 
union 
select '2017-09-28 09:48:54' ,'2017-09-28 13:39:13'
union 
select '2017-09-20 13:52:43' ,'2017-09-20 14:14:43' 
  )
, b AS (
SELECT
    begat
  , endat
  , (begat > MAX(endat) OVER w IS TRUE)::INT is_new
FROM a
WINDOW w AS (ORDER BY begat ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)
) 
, c AS (
SELECT
    begat
  , endat
  , SUM((is_new)) OVER (ORDER BY begat) seq
FROM b
)
SELECT
    MIN(begat) beg_at
  , MAX(endat) end_at
FROM c
GROUP BY seq