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

Как да транспонирате редове в колони въз основа на интервали от време в MYSQL

Един метод използва 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');

Това може да върне повече от един резултат за тест, ако състоянието може да се "връща" на 'open' . Можете да използвате row_number() ако не искате това поведение:

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;

РЕДАКТИРАНЕ:

(за коригирани данни)

Можете просто да използвате условно агрегиране:

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;

Тук е db<>цигулка

Ако искате да реконструирате id , можете да използвате израз като:

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. Разбор на времеви печати - направете го в MySQL или в PHP?

  2. Python Matplotlib и MySQL и Ginput

  3. MySQL група по дата и конвертиране от времеви печат на unix

  4. MySQL изберете едно поле от таблицата WHERE условието е в няколко реда

  5. Предупреждение:неуспешно отваряне на поток:Няма такъв файл или директория в C:\wamp\www\laravel\bootstrap\autoload.php на ред 17