PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Kết hợp nhiều hàng với các ngày khác nhau với các biến chồng chéo (để nắm bắt ngày thay đổi đầu tiên và cuối cùng)

Cân nhắc sử dụng LAG chức năng cửa sổ và kết hợp tổng hợp có điều kiện thông qua nhiều CTE và tự tham gia:

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 trực tuyến

người dùng first_type first_type_initial_date last_type last_type_initial_date
A Di động 2019-01-10 00:00:00 Máy tính để bàn 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. THAM GIA TRÁI trong PostgreSQL là gì

  2. Trả lại tất cả hồ sơ lịch sử cho các tài khoản có thay đổi về giá trị liên quan cụ thể

  3. Tại sao PostgreSQL xử lý truy vấn của tôi khác nhau trong một hàm?

  4. Điền nhiều trường 2many (odoo 8)

  5. PostgreSQL - cách cải thiện truy vấn / chỉ mục này