sql >> Database teknologi >  >> RDS >> PostgreSQL

postgresql, der kombinerer flere perioder til én

Hej, jeg vil foreslå at bruge følgende proces:

1- Identificer, hvornår en række er ny, så du giver en værdi på 1 til værdier, der ikke overlapper (CTE b)

2- Sæt rækkerne sammen, der har overlapninger med andre. På denne måde kan du se, at du har en fælles identifikator, der giver dig mulighed for at MAX og MIN begat og endat (CTE c)

3- For hver sekvens skal du angive MIN for begat og MAX for endat, så du har dine endelige værdier

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. Fil ikke fundet Undtagelse ved forsøg på at uploade fil til xampp-server fra Android-applikation

  2. Tvinge Postgres til at installere med UTF8-kodning, ikke LATIN1?

  3. Tilføjelse af flere datalagre til Microsoft Power BI

  4. Sådan overføres en null-variabel til en SQL Stored Procedure fra C#.net-kode