Estou com um problema de vigência em uma tabela de dados históricos onde, uma chave pode ter vários subitens porém apenas um deles pode estar vigentes, acontece que dentre estes casos existem alguns registros que a vigência do próximo registro começa antes de terminar a sua última! É, parece estranho, talvez um pouco confuso (pelo menos a princípio). Mas vou tentar exemplificar:
ID SUBID DTINICIO DTFIM
1 2 10/05/2010 09/05/2010 -- CORRETO
1 3 08/05/2010 31/12/2010
* Pela regra o que determina se um registro está aberto é a maior data, ou seja,
31/12/2100, caso a vigência esteja fechada a DTFIM é igual a DTINICIO - 1.
Pensei em alguns casos, mas talvez pareça tão óbvio que não tenho certeza se me retornará o que eu quero e preciso. A principal dúvida é, como vou retornar o próximo SUBIDs vigente onde a data de início seja menor que a data fim do registro anterior, por isso, fiz algo assim:
SELECT H.*
FROM
( SELECT H1.ID_PC_SERVICO_EQUIP AS ID_PC_SERVICO_EQUIP,
H1.DT_INICIO AS DT_INICIO,
H1.DT_FIM AS DT_FIM
FROM P_DWDB.PC_SERVICO_CARACTERISTICA_HIST H1
) A, P_DWDB.PC_SERVICO_CARACTERISTICA_HIST H
WHERE A. ID_PC_SERVICO_EQUIP = H. ID_PC_SERVICO_EQUIP
AND H.DT_INICIO > A.DT_FIM
OU
SELECT DISTINCT
H.ID_PC_SERVICO_EQUIP AS ID_PC_SERVICO_EQUIP,
H.ID_CARACTERISTICA AS ID_CARACTERISTICA,
H.DT_INICIO AS DT_INICIO,
H.DT_FIM AS DT_FIM,
A.DT_FIM AS DT_FIM_REGISTRO_ANTERIOR
FROM
( SELECT H1.ID_PC_SERVICO_EQUIP AS ID_PC_SERVICO_EQUIP,
H1.DT_INICIO AS DT_INICIO,
H1.DT_FIM AS DT_FIM
FROM P_DWDB.PC_SERVICO_CARACTERISTICA_HIST H1
WHERE TRIM(SUBSTR( CAST(DT_FIM AS CHAR(10)),1,10)) NOT IN ('2100-12-31')
) A,
( SELECT COUNT(*) AS QTD,
H2.ID_PC_SERVICO_EQUIP AS ID_PC_SERVICO_EQUIP,
H2.ID_CARACTERISTICA AS ID_CARACTERISTICA
FROM P_DWDB.PC_SERVICO_CARACTERISTICA_HIST H2
GROUP BY 2,3
HAVING QTD > 1
) B, P_DWDB.PC_SERVICO_CARACTERISTICA_HIST H
WHERE A. ID_PC_SERVICO_EQUIP = H. ID_PC_SERVICO_EQUIP
AND A.ID_PC_SERVICO_EQUIP = B.ID_PC_SERVICO_EQUIP
AND B. ID_PC_SERVICO_EQUIP = H. ID_PC_SERVICO_EQUIP
AND TRIM(SUBSTR( CAST(H.DT_FIM AS CHAR(10)),1,10)) IN ('2100-12-31')
AND H.DT_INICIO < A.DT_FIM
ORDER BY H.DT_INICIO
* O segundo SELECT apresentado, foi porque eu só preciso verificar os registros das chaves que possuirem mais de um SUBIDs.
Então caros companheiros, se possível, fico no aguardo de algum comentário.
Grato e atenciosamente.