PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Gabungkan beberapa baris dengan tanggal berbeda dengan variabel yang tumpang tindih (untuk menangkap tanggal perubahan pertama dan terakhir)

Pertimbangkan untuk menggunakan LAG fungsi jendela dan agregasi bersyarat bergabung melalui beberapa CTE dan bergabung sendiri:

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"

Demo Online

pengguna jenis_pertama first_type_initial_date jenis_terakhir last_type_initial_date
A Seluler 2019-01-10 00:00:00 Desktop 01-01-2020 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. Skenario konkurensi dengan INSERT

  2. Setelah memulihkan serial database saya dihapus dari kolom di Postgresql

  3. Bagaimana cara mendapatkan nilai dari baris yang dimasukkan terakhir?

  4. Tambahkan batasan datetime ke indeks parsial multi-kolom PostgreSQL

  5. Bagaimana cara mengatur penyisipan ke file yang dibuat grails dengan nomor urut berikutnya?