sql >> Database teknologi >  >> RDS >> Oracle

ROW_NUMBER forespørgsel

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 vil se, om stoppet skifter mellem en række og den næste. Hvis det gør det, vil du øge sekvensen. Så brug lag for at få det forrige stop ind i den aktuelle række.

Jeg brugte DECODE på grund af den måde, den håndterer NULL på, og den er mere kortfattet end CASE, men hvis du følger lærebogen, skal du nok bruge CASE.

Brug af SUM som en analytisk funktion med en ORDER BY-klausul vil give det svar, du leder efter.



  1. MySql-forespørgsel kører, men det virker ikke i sp

  2. Manglende indekser i MS SQL eller optimering på ingen tid

  3. hvordan man dropper databasen

  4. PHP:Gentag over flere arrays og byg SQL INSERT-forespørgsel