sql >> Databasteknik >  >> RDS >> PostgreSQL

postgresql som kombinerar flera perioder till en

Hej, jag skulle föreslå att du använder följande process:

1- Identifiera när en rad är ny, så du ger värdet 1 till värden som inte överlappar (CTE b)

2- Sekvensera ihop de rader som har överlappning med andra. På så sätt kan du se att du har en gemensam identifierare som gör att du kan MAX och MIN begat och endat (CTE c)

3- För varje sekvens, ange MIN för begat och MAX för endat så att du får dina slutvärden

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. bearbetning av ett stort antal databasposter med personsökning saktar ner med tiden

  2. Är det möjligt att ha en standardparameter för en lagrad mysql-procedur?

  3. ScaleGrid DigitalOcean-stöd för MySQL, PostgreSQL och Redis™ nu tillgängligt

  4. Sequelize skapar inte främmande nycklar som begränsningar