sql >> Database >  >> RDS >> Oracle

ROW_NUMBER zoekopdracht

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 

U wilt zien of de stop verandert tussen de ene rij en de volgende. Als dit het geval is, wilt u de reeks verhogen. Gebruik dus lag om de vorige stop in de huidige rij te krijgen.

Ik heb DECODE gebruikt vanwege de manier waarop het met NULL's omgaat en het is beknopter dan CASE, maar als je het tekstboek volgt, zou je waarschijnlijk CASE moeten gebruiken.

Het gebruik van SUM als analytische functie met een ORDER BY-clausule geeft het antwoord dat u zoekt.



  1. Vind het aandeel van elke X bestaande uit Y in PostgreSQL?

  2. Hoe klob-veldgegevens te exporteren in Oracle SQL Developer

  3. Te grote POST-gegevens. Verklein de gegevens of verhoog de post_max_size

  4. MySQL SUM-functie in meerdere joins