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

OracleAnalytic関数-ウィンドウ句のリセット

    これは少し複雑です。 rank()を使用する代わりに など、lag()を使用します 何かがいつ変わるかを見るために。次に、フラグの累積合計を実行します。

    select dept, date1,
           CASE WHEN StartFlag = 0 THEN 1
                ELSE 1+StartFlag+NVL(lag(StartFlag) over (order by date1),0)
           END as rnk
    from (select t1.*,
                 (case when dept = lag(dept) over (order by date1)
                       then 1
                       else 0
                  end) as StartFlag
          from t1
         ) t1
    order by date1;
    

    これがSQLFiddleです。

    編集:

    これはゴードンが私自身の答えを編集しているところです。おっと。元のクエリはそこまでの90%でした。 グループを特定しました 番号を増やす必要がありますが、グループ内で番号を割り当てませんでした。これは、別のレベルのrow_number()で行います。 のように:

    select dept, date1,
           row_number() over (partition by dept, grp order by date1) as rnk
    from (select dept, date1, startflag,
                 sum(StartFlag) over (partition by dept order by date1) as grp
          from (select t1.*,
                       (case when dept = lag(dept) over (order by date1)
                             then 0
                             else 1
                        end) as StartFlag
                from t1
               ) t1
         ) t1
    order by date1;
    

    したがって、全体的な考え方は次のとおりです。最初にlag()を使用します グループがどこから始まるか(つまり、ある日付から次の日付に部門が変わる場所)を決定します。次に、累積合計を実行して、これらに「グループID」を割り当てます。これらは列挙されるレコードです。最後のステップは、row_number()を使用してそれらを列挙することです。 。



    1. MySQLでユーザーと認証を管理する方法

    2. 断続的なODBC接続の失敗

    3. MariaDB JSON_MERGE_PRESERVE()の説明

    4. SQL ServerのSTUFF()に相当するMySQLは何ですか?