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

Oracleの日付の間に列の値が変更されたときに行を選択しますか?

    COUNT( DISTINCT code ) OVER ( PARTITION BY id )を使用できます 1回のテーブルスキャンのみを使用して回答を取得する分析関数:

    SQLフィドル

    Oracle11gR2スキーマのセットアップ

    CREATE TABLE table_name ( ID, Code, "DATE" ) AS
    SELECT 1, 'A', DATE '2018-02-19' FROM DUAL UNION ALL
    SELECT 1, 'B', DATE '2018-02-18' FROM DUAL UNION ALL
    SELECT 1, 'B', DATE '2018-02-17' FROM DUAL UNION ALL
    SELECT 1, 'B', DATE '2018-02-16' FROM DUAL UNION ALL
    SELECT 2, 'A', DATE '2018-02-17' FROM DUAL UNION ALL
    SELECT 2, 'B', DATE '2018-02-16' FROM DUAL UNION ALL
    SELECT 3, 'A', DATE '2018-02-17' FROM DUAL UNION ALL
    SELECT 3, 'A', DATE '2018-02-16' FROM DUAL UNION ALL
    SELECT 4, 'D', DATE '2018-02-16' FROM DUAL;
    

    クエリ1

    SELECT ID,
           Code,
           "DATE"
    FROM   (
      SELECT t.*,
             COUNT( DISTINCT code ) OVER ( PARTITION BY id ) AS num_changes
      FROM   table_name t
      WHERE  "DATE" BETWEEN DATE '2018-02-16'
                        AND DATE '2018-02-19'
    )
    WHERE num_changes > 1
    

    結果

    | ID | CODE |                 DATE |
    |----|------|----------------------|
    |  1 |    A | 2018-02-19T00:00:00Z |
    |  1 |    B | 2018-02-18T00:00:00Z |
    |  1 |    B | 2018-02-17T00:00:00Z |
    |  1 |    B | 2018-02-16T00:00:00Z |
    |  2 |    A | 2018-02-17T00:00:00Z |
    |  2 |    B | 2018-02-16T00:00:00Z |
    

    クエリ2

    SELECT ID,
           Code,
           "DATE"
    FROM   (
      SELECT t.*,
             COUNT( DISTINCT code ) OVER ( PARTITION BY id ) AS num_changes
      FROM   table_name t
      WHERE  "DATE" BETWEEN DATE '2018-02-16'
                        AND DATE '2018-02-18'
    )
    WHERE num_changes > 1
    

    結果

    | ID | CODE |                 DATE |
    |----|------|----------------------|
    |  2 |    A | 2018-02-17T00:00:00Z |
    |  2 |    B | 2018-02-16T00:00:00Z |
    


    1. Oracleの緯度経度距離計算クエリ

    2. SQL Server:同等のテーブルカスケードを削除しますか?

    3. mysql TIME_WAIT;接続の問題が多すぎます

    4. RailsはどのようにMySQLステートメントを作成しますか?