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