sql >> Databáze >  >> RDS >> Mysql

Jak transponovat řádky do sloupců na základě časových intervalů v MYSQL

Jedna metoda používá 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');

To může vrátit více než jeden výsledek testu, pokud se stav může "vrátit" na 'open' . Můžete použít row_number() pokud toto chování nechcete:

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:

(pro upravená data)

Stačí použít podmíněnou agregaci:

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;

Zde je db<>hudlík

Pokud chcete rekonstruovat id , můžete použít výraz jako:

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



  1. Úlohy hybridní databáze OLTP/Analytics:Replikace dat MySQL do ClickHouse

  2. Jak vytvoříte verzi schématu databáze?

  3. Nefungují asynchronní metody MySQL C#?

  4. Hledání duplicitních hodnot v MySQL