sql >> Database teknologi >  >> RDS >> PostgreSQL

Kombiner flere rækker med forskellige datoer med overlappende variabler (for at fange første og sidste ændringsdatoer)

Overvej at bruge en LAG vinduesfunktion og betinget aggregering join via flere CTE'er og selv-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"

Onlinedemo

bruger first_type first_type_initial_date sidste_type last_type_initial_date
A Mobil 2019-01-10 00:00:00 Skrivebord 2021-01-03 00:00:00


  1. Flere forbindelser med samme forbindelsesstreng under en enkelt transaktion, forhøjet transaktion?

  2. Hvordan kan jeg omskrive denne forespørgsel for at undgå fejlen:Du kan ikke angive måltabel for opdatering i FROM-klausulen

  3. MySQL Workbench kan ikke indlæse mysql.proc

  4. Hamming distance på binære strenge i SQL