我有一张桌子:
Trip Stop Time ----------------- 1 A 1:10 1 B 1:16 1 B 1:20 1 B 1:25 1 C 1:31 1 B 1:40 2 A 2:10 2 B 2:17 2 C 2:20 2 B 2:25
我想在我的查询输出中增加一列:
Trip Stop Time Sequence ------------------------- 1 A 1:10 1 1 B 1:16 2 1 B 1:20 2 1 B 1:25 2 1 C 1:31 3 1 B 1:40 4 2 A 2:10 1 2 B 2:17 2 2 C 2:20 3 2 B 2:25 4
困难的部分是B,如果B彼此相邻,我希望它具有相同的顺序,如果不是,则视为新行。
我知道
row_number over (partition by trip order by time) row_number over (partition by trip, stop order by time)
他们都不符合我想要的条件。有没有办法查询这个?
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
您想查看停靠点是否在一行和下一行之间改变。如果是这样,您要增加序列。因此,请使用lag将上一个停靠点移至当前行。
我之所以使用DECODE是因为它处理NULL的方式,并且比CASE更为简洁,但是如果您正在阅读教科书,则可能应该使用CASE。
将SUM用作带有ORDER BY子句的解析函数将提供您要寻找的答案。