Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment transposer des lignes en colonnes en fonction d'intervalles de temps dans MYSQL

Une méthode utilise 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');

Cela peut renvoyer plus d'un résultat pour un test, si le statut peut "revenir" à 'open' . Vous pouvez utiliser row_number() si vous ne voulez pas ce comportement :

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;

MODIFIER :

(pour les données ajustées)

Vous pouvez simplement utiliser l'agrégation conditionnelle :

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;

Ici est un db<>violon

Si vous voulez reconstruire le id , vous pouvez utiliser une expression telle que :

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