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

अतिव्यापी चर के साथ अलग-अलग तिथियों के साथ कई पंक्तियों को मिलाएं (पहली और अंतिम परिवर्तन तिथियों को पकड़ने के लिए)

LAG . का उपयोग करने पर विचार करें विंडो फ़ंक्शन और कंडीशनल एग्रीगेशन कई सीटीई और सेल्फ़-जॉइन के ज़रिए जुड़ते हैं:

WITH sub AS (
  SELECT "user"
       , "type"
       , "date"
       , CASE 
            WHEN LAG("type") OVER(PARTITION BY "user" ORDER BY "date") = "type"
            THEN 0
            ELSE 1
         END "shift"
  FROM myTable 
), agg AS (
   SELECT "user"
         , MIN(CASE WHEN shift = 1 THEN "date" END) AS min_shift_dt
         , MAX(CASE WHEN shift = 1 THEN "date" END) AS max_shift_dt
   FROM sub
   GROUP BY "user"
)


SELECT agg."user"
     , s1."type" AS first_type
     , s1."date" AS first_type_initial_date
     , s2."type" AS last_type
     , s2."date" AS last_type_initial_date
FROM agg
INNER JOIN sub AS s1
  ON agg."user" = s1."user"
  AND agg.min_shift_dt = s1."date"
  
INNER JOIN sub AS s2
  ON agg."user" = s2."user"
  AND agg.max_shift_dt = s2."date"

ऑनलाइन डेमो

<थ>प्रथम_प्रकार <थ>पहली_प्रकार_प्रारंभिक_तिथि
उपयोगकर्ता last_type last_type_initial_date
मोबाइल 2019-01-10 00:00:00 डेस्कटॉप 2021-01-03 00:00:00


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डेटाबेस नाम निर्दिष्ट किए बिना मैं PostgreSQL से कैसे जुड़ूं?

  2. वर्ण भिन्न प्रकारों के लिए लंबाई क्यों निर्दिष्ट करें

  3. CURRENT_TIMESTAMP मिलीसेकंड में

  4. (var)char प्रदर्शन के लिए कॉलम के प्रकार के रूप में?

  5. PostgreSQL से कोई टेम्पलेट डेटाबेस कैसे छोड़ता है?