sql >> Databáze >  >> RDS >> Oracle

ROW_NUMBER dotaz

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 

Chcete zjistit, zda se zarážka mění mezi jedním řádkem a dalším. Pokud ano, chcete sekvenci zvýšit. Použijte tedy prodlevu, abyste dostali předchozí zastávku do aktuálního řádku.

Použil jsem DECODE kvůli způsobu, jakým zpracovává hodnoty NULL a je stručnější než CASE, ale pokud postupujete podle učebnice, měli byste pravděpodobně použít CASE.

Použití SUM jako analytické funkce s klauzulí ORDER BY poskytne odpověď, kterou hledáte.



  1. Jak změnit datovou složku MySQL 8.0. Mohu používat složky OneDrive?

  2. Funkce MySql 5.7 Výchozí řazení UUID() - Nelegální kombinace řazení

  3. mám aktivovat sdružování příkazů c3p0?

  4. Jak spojit dvě tabulky v příkazu UPDATE?