PERSONKEYとROOMKEYでグループ化された部屋のチェックインとチェックアウトの時間を含むテーブル(ROOMUSAGE)があります。次のようになります。
PERSONKEY | ROOMKEY | CHECKIN | CHECKOUT | ROW
----------------------------------------------------------------
1 | 8 | 13-4-2010 10:00 | 13-4-2010 11:00 | 1
1 | 8 | 13-4-2010 08:00 | 13-4-2010 09:00 | 2
1 | 1 | 13-4-2010 15:00 | 13-4-2010 16:00 | 1
1 | 1 | 13-4-2010 14:00 | 13-4-2010 15:00 | 2
1 | 1 | 13-4-2010 13:00 | 13-4-2010 14:00 | 3
13 | 2 | 13-4-2010 15:00 | 13-4-2010 16:00 | 1
13 | 2 | 13-4-2010 15:00 | 13-4-2010 16:00 | 2
PERSONKEY、ROOMKEYグループごとに連続する行だけを選択したいと思います。したがって、必要な結果のテーブルは次のとおりです。
PERSONKEY | ROOMKEY | CHECKIN | CHECKOUT | ROW
----------------------------------------------------------------
1 | 8 | 13-4-2010 10:00 | 13-4-2010 11:00 | 1
1 | 1 | 13-4-2010 15:00 | 13-4-2010 16:00 | 1
1 | 1 | 13-4-2010 14:00 | 13-4-2010 15:00 | 2
1 | 1 | 13-4-2010 13:00 | 13-4-2010 14:00 | 3
13 | 2 | 13-4-2010 15:00 | 13-4-2010 16:00 | 1
カーソルの使用を避けたいので、再帰CTEを使用すると思いました。これが私が思いついたものです:
;with CTE (PERSONKEY, ROOMKEY, CHECKIN, CHECKOUT, ROW)
as (select RU.PERSONKEY,
RU.ROOMKEY,
RU.CHECKIN,
RU.CHECKOUT,
RU.ROW
from ROOMUSAGE RU
where RU.ROW = 1
union all
select RU.PERSONKEY,
RU.ROOMKEY,
RU.CHECKIN,
RU.CHECKOUT,
RU.ROW
from ROOMUSAGE RU inner join CTE on RU.ROW = CTE.ROW + 1
where CTE.CHECKIN = RU.CHECKOUT
and CTE.PERSONKEY = RU.PERSONKEY
and CTE.ROOMKEY = RU.ROOMKEY)
これは、非常に小さいデータセット(100レコード未満)では問題なく機能しましたが、大きいデータセットでは使用できません。
ROOMUSAGEテーブルの各PERSONKEY、ROOMKEYグループに、どういうわけかcteを繰り返し適用する必要があると思いますが、その方法がわかりません。
どんな助けでも大歓迎です、
乾杯!