PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Комбинирайте множество редове с различни дати с припокриващи се променливи (за улавяне на първата и последната дата на промяна)

Обмислете използването на LAG прозоречна функция и условно агрегиране чрез множество CTE и самосъединявания:

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"

Онлайн демонстрация

потребител първи_тип first_type_initial_date последен_тип last_type_initial_date
A Мобилен 2019-01-10 00:00:00 Настолен компютър 2021-01-03 00:00:00


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ГРЕШКА:входните параметри след един със стойност по подразбиране също трябва да имат стойности по подразбиране в Postgres

  2. Java JDBC игнорира setFetchSize?

  3. Грешка при създаване на Postgres POSTGIS разширение с CentOS 6

  4. Хибернация „Инверсия“ във файла за картографиране

  5. Хибернация:дублираната стойност на ключ нарушава уникалното ограничение