次の列を持つテーブルがあります: 1. User_Id 2. Work_Date
create table Test_Seq(user_id number, work_date date);
次のデータがあります。
insert into Test_Seq values (1, '01-SEP-2013');
insert into Test_Seq values (1, '02-SEP-2013');
insert into Test_Seq values (1, '06-SEP-2013');
insert into Test_Seq values (1, '09-SEP-2013');
insert into Test_Seq values (1, '10-SEP-2013');
insert into Test_Seq values (2, '10-SEP-2013');
insert into Test_Seq values (2, '26-SEP-2013');
insert into Test_Seq values (2, '30-SEP-2013');
insert into Test_Seq values (2, '01-OCT-2013');
このテーブルには、ユーザーの work_date が格納されます。この work_date は、連続している場合とそうでない場合があります。
もう 1 つのテーブルがあります。
create table temp_holidys (holiday date);
insert into temp_holidys values ('27-SEP-2013');
insert into temp_holidys values ('31-DEC-2013');
最後の Work_Date (降順) とそれに関連するシーケンスの開始日を取得するには、クエリ / pl sql が必要です。土日は記録がありませんが、順番に扱います(暦日)。
土曜と日曜をシーケンスの一部として扱っているのと同じように、その日が temp_holidys テーブルにある場合は、日もシーケンスで扱う必要があります (以下の #2 を参照)。
- user_id 1 の場合、終了日は「10-SEP-2013」、開始日は「06-SEP-2013」になります。
- user_id 2 の場合、終了日として「01-OCT-2013」、開始日として「26-SEP-2013」を指定する必要があります (2013 年 10 月 27 日は、temp_holidys テーブルで定義されているため、順番に処理する必要があります)。
- たとえば、# 1 でユーザー ID 1 の場合、'09-SEP-2013' のレコードがなかった場合、開始日として '10-SEP-2013' を返す必要がある場合は、シーケンスを意味する必要があります。#2でも、ユーザー2の場合、「2013年9月26日」にレコードがなかった場合、開始日として2013年9月30日を返す必要があります。