create table test
(trip number
,stp varchar2(1)
,tm varchar2(10)
,seq number);
insert into test values (1, 'A', '1:10', 1);
insert into test values (1, 'B', '1:16', 2);
insert into test values (1, 'B', '1:20', 2);
insert into test values (1 , 'B', '1:25', 2);
insert into test values (1 , 'C', '1:31', 3);
insert into test values (1, 'B', '1:40', 4);
insert into test values (2, 'A', '2:10', 1);
insert into test values (2, 'B', '2:17', 2);
insert into test values (2, 'C', '2:20', 3);
insert into test values (2, 'B', '2:25', 4);
select t1.*
,sum(decode(t1.stp,t1.prev_stp,0,1)) over (partition by trip order by tm) new_seq
from
(select t.*
,lag(stp) over (order by t.tm) prev_stp
from test t
order by tm) t1
;
TRIP S TM SEQ P NEW_SEQ
------ - ---------- ---------- - ----------
1 A 1:10 1 1
1 B 1:16 2 A 2
1 B 1:20 2 B 2
1 B 1:25 2 B 2
1 C 1:31 3 B 3
1 B 1:40 4 C 4
2 A 2:10 1 B 1
2 B 2:17 2 A 2
2 C 2:20 3 B 3
2 B 2:25 4 C 4
10 rows selected
आप देखना चाहते हैं कि स्टॉप एक पंक्ति और अगली के बीच बदलता है या नहीं। यदि ऐसा होता है, तो आप अनुक्रम को बढ़ाना चाहते हैं। इसलिए पिछले पड़ाव को वर्तमान पंक्ति में लाने के लिए अंतराल का उपयोग करें।
मैंने DECODE का उपयोग इसलिए किया क्योंकि यह NULLs को संभालता है और यह CASE से अधिक संक्षिप्त है, लेकिन यदि आप पाठ्य पुस्तक का अनुसरण कर रहे हैं, तो आपको संभवतः CASE का उपयोग करना चाहिए।
ORDER BY क्लॉज के साथ एक विश्लेषणात्मक फ़ंक्शन के रूप में SUM का उपयोग करने से वह उत्तर मिलेगा जिसकी आप तलाश कर रहे हैं।