oracle連続ログイン/出勤日数の計算

1424 ワード

ユーザーの連続勤務日数を計算するレポートがあり、row_number解析関数はこの問題を完璧に計算できる.
このSQLは、コンピューティングユーザーの連続ログイン、署名、出勤、欠勤などの問題を解決することができます.
  • まずrow_number日付順
  • 日付の日、例えば2016-7-1を切り出して数字
  • に変換する.
  • この日付の数字をrow_を減算number算出値は、パケット番号として、不連続な値で算出されたパケット番号が一致しないためである.
  • パケット番号フィールドに従ってグループbyを行い、各セグメントの連続勤務の開始、終了時間、日数
  • を算出することができる.
    元のデータのように
    2016/7/1
    2016/7/2
    2016/7/4
    2016/7/5
    2016/7/6
    2016/7/7
    ……
    計算した結果は
    グループ番号開始時間終了日数
    0    2016/7/1    2016/7/2    2
    1    2016/7/4    2016/7/9    6
    ……
    次のコード
    with t1 as
    (
    select date'2016-7-1' d1 from dual
    union
    select date'2016-7-2' d1 from dual
    union
    select date'2016-7-4' d1 from dual
    union
    select date'2016-7-5' d1 from dual
    union
    select date'2016-7-6' d1 from dual
    union
    select date'2016-7-7' d1 from dual
    union
    select date'2016-7-8' d1 from dual
    union
    select date'2016-7-9' d1 from dual
    union
    select date'2016-7-11' d1 from dual
    union
    select date'2016-7-12' d1 from dual
    union
    select date'2016-7-13' d1 from dual
    union
    select date'2016-7-14' d1 from dual
    union
    select date'2016-7-18' d1 from dual
    union
    select date'2016-7-19' d1 from dual
    )
    select gn,min(d1),max(d1),count(*) 
    from(
    select d1,to_number(to_char(d1,'dd'))-row_number() over(order by d1) gn from t1
    )group by gn order by 2