sql >> Database >  >> RDS >> Mysql

Hoe rijen naar kolommen te transponeren op basis van tijdsintervallen in MYSQL

Eén methode gebruikt 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');

Dit kan meer dan één resultaat voor een test opleveren, als de status kan "terugkeren" naar 'open' . U kunt row_number() . gebruiken als je dit gedrag niet wilt:

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;

BEWERKEN:

(voor aangepaste gegevens)

U kunt gewoon voorwaardelijke aggregatie gebruiken:

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;

Hier is een db<>viool

Als u de id . wilt reconstrueren , kunt u een uitdrukking gebruiken zoals:

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



  1. SELECTEER verschillende waarden voor meerdere rijen met dezelfde ID

  2. Mysql-optimalisatie op basis van explain

  3. Wijzigingen in de tijdlijn tellen met MySQL

  4. Hoe de primaire index opnieuw te berekenen?