sql >> Database >  >> RDS >> PostgreSQL

postgresql combineert verschillende perioden in één

Hallo, ik zou willen voorstellen om het volgende proces te gebruiken:

1- Identificeer wanneer een rij nieuw is, zodat u een waarde van 1 geeft aan waarden die elkaar niet overlappen (CTE b)

2- Zet de rijen die elkaar overlappen in een rij samen. Op deze manier kun je zien dat je een gemeenschappelijke identifier hebt waarmee je MAX en MIN kunt verwekken en endaten (CTE c)

3- Geef voor elke reeks het MIN van begat en het MAX van endat, zodat u uw uiteindelijke waarden hebt

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


  1. Hoe kan ik ervoor zorgen dat mijn postgresql-database een hoofdletterongevoelige sortering gebruikt?

  2. Bericht:count():Parameter moet een array of een object zijn dat Countable codeigniter implementeert op centos

  3. Hoe voeg je jsonb-array-elementen toe in Postgres?

  4. mysqldump werkt niet in crontab