sql >> Database teknologi >  >> RDS >> Mysql

Sådan transponeres rækker til kolonner baseret på tidsintervaller i MYSQL

En metode bruger lag() :

vælg t.*fra (vælg t.*, lag(status) over (partition efter val, navnerækkefølge efter dato) som prev_status fra t ) hvor status ='åben' og (prev_status er null eller prev_status <> 'åben');

Dette kan returnere mere end ét resultat for en test, hvis status kan "vende tilbage" til 'åben' . Du kan bruge row_number() hvis du ikke ønsker denne adfærd:

vælg t.*fra (vælg t.*, rækkenummer() over (partition efter val, navn, statusrækkefølge efter dato) som følgenummer fra t ) hvor status ='åben' og følgenummer =1; 

EDIT:

(for justerede data)

Du kan bare bruge betinget aggregering:

vælg val, navn, 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 tgroup by val, name; 

Her er en db<>violin

Hvis du vil rekonstruere id , kan du bruge et udtryk som:

row_number() over (rækkefølge efter min(dt)) som id 



  1. Databasedesign til kommentarer og svar

  2. MySQL Bestem den længste VarChar-længde

  3. Hvordan skelner man mellem de samme feltnavne på to tabeller i en udvalgt forespørgsel?

  4. Hvordan laver jeg store ikke-blokerende opdateringer i PostgreSQL?