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

指定された基準を満たす連続した日数を取得します

    このクエリは、各行のカウントを生成します:

    SELECT allocation, d, count(*) OVER (PARTITION BY allocation, part ORDER BY d) AS c
    FROM (
      SELECT allocation, d,
             d - row_number() OVER (PARTITION BY allocation ORDER BY d) AS part
      FROM t
    )
    ORDER BY d;
    

    次に、それをフィルタリングして、特定の行のカウントを見つけることができます。

    SELECT c
    FROM (
      SELECT allocation, d, count(*) OVER (PARTITION BY allocation, part ORDER BY d) AS c
      FROM (
        SELECT allocation, d,
               d - row_number() OVER (PARTITION BY allocation ORDER BY d) AS part
        FROM t
      )
    )
    WHERE d = DATE '2015-01-05';
    

    説明:

    派生テーブルは、さまざまな「パーティション」partを計算するために使用されます 日付と割り当てごと:

      SELECT allocation, d,
             d - row_number() OVER (PARTITION BY allocation ORDER BY d) AS part
      FROM t
    

    結果は次のとおりです。

    allocation  d           part
    --------------------------------
    Same        01.01.15    31.12.14
    Good        02.01.15    01.01.15
    Same        03.01.15    01.01.15
    Same        04.01.15    01.01.15
    Same        05.01.15    01.01.15
    Good        06.01.15    04.01.15
    

    partによって生成された具体的な日付 無関係です。割り当て内の日付の各「グループ」で同じになるのは、ほんの一部の日付です。次に、(allocation, part)の同一の値の数を数えることができます count(*) over(...)を使用する ウィンドウ関数:

    SELECT allocation, d, count(*) OVER (PARTITION BY allocation, part ORDER BY d) AS c
    FROM (...)
    ORDER BY d;
    

    希望する結果を生み出すために。

    データ

    例として次の表を使用しました:

    CREATE TABLE t AS (
      SELECT DATE '2015-01-01' AS d, 'Same' AS allocation FROM dual UNION ALL
      SELECT DATE '2015-01-02' AS d, 'Good' AS allocation FROM dual UNION ALL
      SELECT DATE '2015-01-03' AS d, 'Same' AS allocation FROM dual UNION ALL
      SELECT DATE '2015-01-04' AS d, 'Same' AS allocation FROM dual UNION ALL  
      SELECT DATE '2015-01-05' AS d, 'Same' AS allocation FROM dual UNION ALL
      SELECT DATE '2015-01-06' AS d, 'Good' AS allocation FROM dual
    );
    


    1. MSSQLエラー'基になるプロバイダーがOpenで失敗しました'

    2. Oracle接続プールクラス

    3. PostgreSQLは同じ列でペアの一般的な組み合わせを見つけます

    4. データベース(接続)が存在するかどうかを確認するAntタスク?