Teniendo en cuenta la siguientes aparatos:SQL: mejor manera de construir una línea de tiempo a partir de dos tablas de historial
CREATE TABLE Members (MemberID INT)
INSERT Members VALUES (1001)
CREATE TABLE PCPs (PCPID INT)
INSERT PCPs VALUES (231)
INSERT PCPs VALUES (327)
INSERT PCPs VALUES (390)
CREATE TABLE Plans (PlanID INT)
INSERT Plans VALUES (555)
INSERT Plans VALUES (762)
CREATE TABLE MemberPCP (
MemberID INT
, PCP INT
, StartDate DATETIME
, EndDate DATETIME)
INSERT MemberPCP VALUES (1001, 231, '2002-01-01', '2002-06-30')
INSERT MemberPCP VALUES (1001, 327, '2002-07-01', '2003-05-31')
INSERT MemberPCP VALUES (1001, 390, '2003-06-01', '2003-12-31')
CREATE TABLE MemberPlans (
MemberID INT
, PlanID INT
, StartDate DATETIME
, EndDate DATETIME)
INSERT MemberPlans VALUES (1001, 555, '2002-01-01', '2003-03-31')
INSERT MemberPlans VALUES (1001, 762, '2003-04-01', '2003-12-31')
Estoy buscando una manera limpia para construir una línea de tiempo para las relaciones/PCP/miembro del plan, donde un cambio en ya sea el PCP o el plan para un miembro daría como resultado una fila de inicio/final por separado en el resultado. Por ejemplo, si en unos pocos años, un miembro cambió su PCP dos veces y su plan de una vez, pero cada uno en diferentes fechas, me gustaría ver algo como lo siguiente:
MemberID PCP PlanID StartDate EndDate
1001 231 555 2002-01-01 2002-06-30
1001 327 555 2002-07-01 2003-03-31
1001 327 762 2003-04-01 2003-05-31
1001 390 762 2003-06-01 2003-12-31
Como se puede ver, necesito una por separado fila de resultados para cada período de fecha que implique una diferencia en la asociación Miembro/PCP/Plan. Tengo una solución en su lugar, pero es muy compleja con muchas sentencias CASE y lógica condicional en la cláusula WHERE. Solo estoy pensando que hay una manera mucho más simple de hacer esto.
Gracias.
¿Podemos ver su trabajo? –
¿Puedes publicar esta declaración CASE complicada en [SQLFiddle] (http://sqlfiddle.com/) para que podamos ver lo que has hecho? –
Esto es algo realmente complicado de hacer. No sé si hay una * manera mucho más simple * de hacerlo. Entonces, probablemente debería publicar su solución y podemos ayudarlo a comenzar allí – Lamak