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
……
次のコード
このSQLは、コンピューティングユーザーの連続ログイン、署名、出勤、欠勤などの問題を解決することができます.
元のデータのように
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