Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

ROW_NUMBER kueri

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 

Anda ingin melihat apakah perhentian berubah antara satu baris dan baris berikutnya. Jika ya, Anda ingin menambah urutannya. Jadi gunakan lag untuk mendapatkan pemberhentian sebelumnya ke baris saat ini.

Saya menggunakan DECODE karena cara menangani NULL dan lebih ringkas daripada CASE, tetapi jika Anda mengikuti buku teks, Anda mungkin harus menggunakan CASE.

Menggunakan SUM sebagai fungsi analitik dengan klausa ORDER BY akan memberikan jawaban yang Anda cari.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL - Mengapa memberi spasi saat membandingkan karakter?

  2. Peningkatan Otomatis untuk Oracle

  3. Mendapat minus satu dari panggilan baca

  4. Bagaimana memanggil Prosedur yang menggunakan tabel yang sama setelah pemicu

  5. Oracle - SELECT DENSE_RANK OVER (ORDER BY, SUM, OVER dan PARTITION BY)