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

Oracleのレコード範囲内の範囲を選択する方法

    これは良い方法で、派手な名前「タビビトサンメソッド 」です。 「アケティ・ジュウゾウから贈られました。

    SQL> WITH data AS
      2    (SELECT num - DENSE_RANK() OVER(PARTITION BY status ORDER BY num) grp,
      3      status,
      4      num
      5    FROM t
      6    )
      7  SELECT MIN(num)
      8    ||' - '
      9    || MAX(num) range,
     10    COUNT(*) cnt
     11  FROM data
     12  WHERE status='A'
     13  GROUP BY grp
     14  ORDER BY grp
     15  /
    
    RANGE         CNT
    ------ ----------
    1 - 3           3
    6 - 6           1
    9 - 10          2
    
    SQL>
    

    DENSE_RANKを使用することをお勧めします 重複を避けるため。

    SQL> SELECT * FROM t ORDER BY num;
    
           NUM S
    ---------- -
             1 A
             1 A
             2 A
             2 A
             3 A
             4 U
             5 U
             6 A
             7 U
             8 U
             9 A
    
           NUM S
    ---------- -
            10 A
    
    12 rows selected.
    

    num=1の重複があります。

    DENSE_RANKの使用 :

    SQL> WITH data AS
      2    (SELECT num - DENSE_RANK() OVER(PARTITION BY status ORDER BY num) grp,
      3      status,
      4      num
      5    FROM t
      6    )
      7  SELECT MIN(num)
      8    ||' - '
      9    || MAX(num) range,
     10    COUNT(*) cnt
     11  FROM data
     12  WHERE status='A'
     13  GROUP BY grp
     14  ORDER BY grp
     15  /
    
    RANGE         CNT
    ------ ----------
    1 - 3           5
    6 - 6           1
    9 - 10          2
    
    SQL>
    

    ROW_NUMBERの使用 :

    SQL> WITH DATA AS
      2    (SELECT num - ROW_NUMBER() OVER(PARTITION BY status ORDER BY num) grp,
      3      status,
      4      num
      5    FROM t
      6    )
      7  SELECT MIN(num)
      8    ||' - '
      9    || MAX(num) range,
     10    COUNT(*) cnt
     11  FROM data
     12  WHERE status='A'
     13  GROUP BY grp
     14  ORDER BY grp
     15  /
    
    RANGE         CNT
    ------ ----------
    2 - 3           2
    1 - 2           2
    1 - 6           2
    9 - 10          2
    
    SQL>
    

    したがって、重複する場合は、 ROW_NUMBER クエリは誤った結果をもたらします。 DENSE_RANKを使用する必要があります 。



    1. ClusterControlを使用してハイブリッドクラウドMySQLデータベースをデプロイする

    2. C#でSQLServerストアドプロシージャの出力パラメータにアクセスする

    3. 空であるが巨大なLOB列を取り除く方法は?

    4. ORACLESQLROWNUMの実行順序