PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Combinez plusieurs lignes avec des dates différentes avec des variables qui se chevauchent (pour capturer les premières et dernières dates de modification)

Envisagez d'utiliser un LAG fonction de fenêtre et jointure d'agrégation conditionnelle via plusieurs CTE et auto-jointures :

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"

Démo en ligne

utilisateur premier_type first_type_initial_date dernier_type last_type_initial_date
A Mobile 2019-01-10 00:00:00 Bureau 2021-01-03 00:00:00