sql >> データベース >  >> RDS >> Oracle

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 
    

    ストップが1つの行と次の行の間で変化するかどうかを確認する必要があります。含まれている場合は、シーケンスをインクリメントします。したがって、ラグを使用して、前のストップを現在の行に移動します。

    NULLの処理方法と、CASEよりも簡潔であるため、DECODEを使用しましたが、教科書に従っている場合は、おそらくCASEを使用する必要があります。

    SUMをORDERBY句を使用した分析関数として使用すると、探している答えが得られます。



    1. mysqlデータベースを削除して再入力する方法は?

    2. ODBC準拠データベースとは何ですか?

    3. varchar(max)変数の最大サイズ

    4. MySQLトリガーでトランザクションのような機能を使用できますか