PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

postgresql комбинира няколко периода в един

Хей, предлагам да използвате следния процес:

1- Идентифицирайте кога даден ред е нов, така че давате стойност 1 на стойности, които не се припокриват (CTE b)

2- Подредете заедно редовете, които се припокриват с други. По този начин можете да видите, че имате общ идентификатор, който ще ви позволи да MAX и MIN бегат и endat (CTE c)

3- За всяка последователност дайте MIN на begat и MAX на endat, така че да имате крайните си стойности

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. Оптимизирайте заявката с OFFSET върху голяма таблица

  2. Моите любими PostgreSQL заявки и защо са важни

  3. Това е масив, всички NULL в PostgreSQL

  4. Функция LPAD() в PostgreSQL

  5. Django:Група заявки по месец