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
Bạn muốn xem liệu điểm dừng có thay đổi giữa hàng này và hàng tiếp theo hay không. Nếu có, bạn muốn tăng trình tự. Vì vậy, hãy sử dụng độ trễ để đưa điểm dừng trước đó vào hàng hiện tại.
Tôi đã sử dụng DECODE vì cách nó xử lý NULL và ngắn gọn hơn CASE, nhưng nếu bạn đang theo dõi sách văn bản, có lẽ bạn nên sử dụng CASE.
Sử dụng SUM làm hàm phân tích với mệnh đề ORDER BY sẽ đưa ra câu trả lời mà bạn đang tìm kiếm.