Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak transponować wiersze do kolumn na podstawie interwałów czasowych w MYSQL?

Jedna metoda używa 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');

Może to zwrócić więcej niż jeden wynik testu, jeśli status może „powrócić” do 'open' . Możesz użyć row_number() jeśli nie chcesz tego zachowania:

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;

EDYCJA:

(dla danych dostosowanych)

Możesz po prostu użyć agregacji warunkowej:

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;

Tutaj to db<>skrzypce

Jeśli chcesz zrekonstruować id , możesz użyć wyrażenia takiego jak:

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. Jak sprawdzić bazę danych MySQL i rozmiary tabel

  2. Jak automatycznie usuwać co x minut?

  3. Wydajność MYSQL jest niska przy użyciu sortowania plików

  4. Format rekordu obecności na zajęciach Zapytanie SQL

  5. Błąd zamiany lub wstawiania SQL do składni