Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zapytanie o ROW_NUMBER

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 

Chcesz sprawdzić, czy stop zmienia się między jednym wierszem a następnym. Jeśli tak, chcesz zwiększyć sekwencję. Więc użyj opóźnienia, aby umieścić poprzedni przystanek w bieżącym rzędzie.

Użyłem DECODE ze względu na sposób, w jaki obsługuje on NULL i jest bardziej zwięzły niż CASE, ale jeśli podążasz za podręcznikiem, prawdopodobnie powinieneś użyć CASE.

Użycie SUM jako funkcji analitycznej z klauzulą ​​ORDER BY da odpowiedź, której szukasz.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Instrukcja SQL do wyświetlania liczby w słowach bez użycia funkcji bezpośredniej (wyrocznia)

  2. Wycofaj zadeklarowaną transakcję

  3. Jak usunąć dziwną tabelę o nazwie BIN$c+eOnMB3RbKSEfg/rsxtAQ==$0 z bazy danych Oracle?

  4. Łączysz się jednocześnie z SQL Server, Oracle, DB2 i MySQL za pomocą ADO.NET?

  5. Wstawianie rekurencyjne przy użyciu klauzuli connect by