PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Kombinieren Sie mehrere Zeilen mit unterschiedlichen Daten mit überlappenden Variablen (um das Datum der ersten und letzten Änderung zu erfassen)

Erwägen Sie die Verwendung einer LAG Fensterfunktion und bedingte Aggregationsverknüpfung über mehrere CTEs und Selbstverknüpfungen:

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"

Online-Demo

Benutzer erster_Typ first_type_initial_date letzter_Typ last_type_initial_date
A Mobil 2019-01-10 00:00:00 Desktop 2021-01-03 00:00:00