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

Cách chuyển các hàng thành cột dựa trên các khoảng thời gian trong MYSQL

Một phương pháp sử dụng lag() :

select t.*
from (select t.*,
             lag(status) over (partition by val, name order by date) as prev_status
      from t
     ) t
where status = 'open' and
      (prev_status is null or prev_status <> 'open');

Điều này có thể trả về nhiều hơn một kết quả cho một bài kiểm tra, nếu trạng thái có thể "trở lại" thành 'open' . Bạn có thể sử dụng row_number() nếu bạn không muốn hành vi này:

select t.*
from (select t.*,
             row_number() over (partition by val, name, status order by date) as seqnum
      from t
     ) t
where status = 'open' and seqnum = 1;

CHỈNH SỬA:

(đối với dữ liệu đã điều chỉnh)

Bạn chỉ có thể sử dụng kết hợp có điều kiện:

select val, name,
       min(case when status = 'open' then status end) as o_gate,
       min(case when status = 'open' then dt end) as o_dt,
       max(case when status = 'close' then status end) as c_gate,
       max(case when status = 'close' then dt end) as c_dt,
from t
group by val, name;

Tại đây là một db <> fiddle

Nếu bạn muốn tạo lại id , bạn có thể sử dụng một biểu thức như:

row_number() over (order by min(dt)) as id



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP cách trích dẫn giá trị mảng chuỗi

  2. Tạo nhiều trang từ truy vấn sql

  3. Truy vấn phân cấp trong MySQL

  4. cấu trúc bảng mysql với nhiều biến

  5. Có thể sử dụng LIMIT với kết quả truy vấn con không?