एक विधि 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');
यह एक परीक्षण के लिए एक से अधिक परिणाम लौटा सकता है, यदि स्थिति 'open'
पर "वापस" हो सकती है . आप row_number()
. का उपयोग कर सकते हैं अगर आप यह व्यवहार नहीं चाहते हैं:
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;
संपादित करें:
(समायोजित डेटा के लिए)
आप केवल सशर्त एकत्रीकरण का उपयोग कर सकते हैं:
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;
यहां एक डीबी है<>बेला
यदि आप id
का पुनर्निर्माण करना चाहते हैं , आप एक व्यंजक का उपयोग कर सकते हैं जैसे:
row_number() over (order by min(dt)) as id