sql >> Databasteknik >  >> RDS >> Oracle

ROW_NUMBER fråga

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 

Du vill se om stoppet växlar mellan en rad och nästa. Om den gör det vill du öka sekvensen. Så använd fördröjning för att få det föregående stoppet till den aktuella raden.

Jag använde DECODE på grund av hur det hanterar NULL och det är mer kortfattat än CASE, men om du följer läroboken bör du förmodligen använda CASE.

Att använda SUM som en analytisk funktion med en ORDER BY-sats kommer att ge svaret du letar efter.



  1. Hur konverterar man datum från ett format till ett annat?

  2. MySQL - Välj från en lista med nummer de utan motsvarighet i id-fältet i en tabell

  3. Vad är effekten av att placera commit efter DML i proceduren?

  4. Oracle SQL:hur man hittar bara rekord från en grupp