sql >> Database >  >> RDS >> PostgreSQL

Combineer meerdere rijen met verschillende datums met overlappende variabelen (om de eerste en laatste wijzigingsdatums vast te leggen)

Overweeg het gebruik van een LAG vensterfunctie en voorwaardelijke aggregatie join via meerdere CTE's en self-joins:

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

gebruiker first_type first_type_initial_date laatste_type laatste_type_initial_date
A Mobiel 2019-01-10 00:00:00 Bureaublad 2021-01-03 00:00:00


  1. dubbele sleutelwaarde schendt unieke beperking - postgres-fout bij het maken van een sql-tabel van dask-dataframe

  2. MySQL-sortering met symbolen als eerste letter

  3. CSV-kopie naar Postgres met een array van aangepast type met behulp van JDBC

  4. Maak MySQL-database in Python met behulp van de %s-operator