sql >> Databasteknik >  >> RDS >> PostgreSQL

Kombinera flera rader med olika datum med överlappande variabler (för att fånga första och senaste ändringsdatum)

Överväg att använda en LAG fönsterfunktion och villkorlig aggregering går med via flera CTE:er och självanslutningar:

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"

Onlinedemo

användare första_typ first_type_initial_date last_type last_type_initial_date
A Mobil 2019-01-10 00:00:00 Skrivbord 2021-01-03 00:00:00


  1. Hur man hittar dubblettdata mellan två tabeller och tar bort på en

  2. TRIGGER eller MULTI Insert

  3. MySQL swap primära nyckelvärden

  4. Symfony2 Doctrine-schemauppdatering misslyckas