J'ai une table (ROOMUSAGE) contenant les heures auxquelles les personnes enregistrent et sortent des pièces regroupées par PERSONKEY et ROOMKEY. Il ressemble à ceci:Application d'un CTE récursif sur des lignes de table groupées (SQL Server 2005)
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
Je veux sélectionner seulement les rangées consécutives pour chaque groupement PERSONKEY, ROOMKEY. Donc la table résultante désirée est:
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
Je veux éviter d'utiliser des curseurs alors j'ai pensé que j'utiliserais un CTE récursif. Voici ce que je suis venu avec:
;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)
Cela a fonctionné OK pour les ensembles de données très petits (moins de 100 dossiers) mais il est inutilisable sur de grands ensembles de données.
Je pense que je devrais appliquer d'une façon ou d'une autre le cte recursevely sur chaque PERSONKEY, ROOMKEY groupant sur ma table ROOMUSAGE mais je ne suis pas sûr comment faire ceci.
Toute aide serait appréciée,
Cheers!
Avez-vous regardé le plan de requête pour cela, je serais prêt à parier que la jointure de RU à CTE est la table fait scrute la façon dont vous le joindre. – BlackICE