PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

postgresql कई अवधियों को एक में मिलाता है

अरे, मैं निम्नलिखित प्रक्रिया का उपयोग करने का सुझाव दूंगा:

1- पहचानें कि कोई पंक्ति कब नई है, इसलिए आप उन मानों को 1 का मान देते हैं जो ओवरलैप नहीं होते हैं (CTE b)

2- उन पंक्तियों को एक साथ अनुक्रमित करें जो दूसरों के साथ ओवरलैप होती हैं। इस तरह आप देख सकते हैं कि एक सामान्य पहचानकर्ता है जो आपको MAX और MIN की शुरुआत और समाप्ति (CTE c)

की अनुमति देगा।

3- प्रत्येक अनुक्रम के लिए, मिन ऑफ़ बेगेट और मैक्स ऑफ़ एंडैट दें ताकि आपके पास अपने अंतिम मान हों

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-XL . में अनुक्रमों और धारावाहिकों का प्रदर्शन

  2. PostgreSQL में एक महीने में दिनों की संख्या प्राप्त करें

  3. PostgreSQL में टेबल पर DELETE अक्षम करें?

  4. कैसे PostgreSQL से डेटाबेस में डंप मर्ज करने के लिए?

  5. एकाधिक पंक्तियों के लिए द्वारा Postgresql समूह