sql >> Databasteknik >  >> RDS >> Mysql

Hur man transponerar rader till kolumner baserat på tidsintervall i MYSQL

En metod använder 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');

Detta kan returnera mer än ett resultat för ett test, om statusen kan "återgå" till 'open' . Du kan använda row_number() om du inte vill ha detta beteende:

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;

EDIT:

(för justerad data)

Du kan bara använda villkorlig aggregering:

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;

Här är en db<>fiol

Om du vill rekonstruera id , kan du använda ett uttryck som:

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



  1. Introducerar ny funktion:Always On Availability Group

  2. MySQL unikt index med flera fält

  3. mysqli_stmt::num_rows() returnerar fel värde

  4. Stöder din Salesforce-drivrutin bulkåtgärder?