PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

postgresql łączenie kilku okresów w jeden

Hej, sugerowałbym użycie następującego procesu:

1- Określ, kiedy wiersz jest nowy, aby nadać wartość 1 wartościom, które się nie nakładają (CTE b)

2- Połącz ze sobą rzędy, które zachodzą na siebie. W ten sposób możesz zobaczyć, że masz wspólny identyfikator, który pozwoli ci MAX i MIN rozpocząć i zakończyć (CTE c)

3- Dla każdej sekwencji podaj MIN początku i MAX końca, aby uzyskać ostateczne wartości

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres SELECT gdzie WHERE jest UUID lub ciągiem

  2. Jak odjąć sekundy od daty i godziny postgres

  3. Nie można połączyć się z serwerem:postgresql na ubuntu w podsystemie windows dla linux

  4. Zainstaluj Postgres.app na komputerze Mac

  5. PostgreSQL działa wolno na dużym stole z tablicami i mnóstwem aktualizacji