Obrigado pela ajuda amigos. Muita coisa já mudou... como os usuarios só precisavam apenas 1 dia para geração de relatórios, o range é de apenas 1 dia.
Muita coisa mudou e, mesmo assim, ficou lento. Depois que o DBA aqui passou a fazer o analyze no banco com mais frequência, aí sim fluiu bem melhor a query...
a quey em sí, está péssima, mas como está funcionando e acabou meu prazo, vou deixar assim mesmo, por enquanto...
tipo, de uma data q tem no registro, tenho q agrupar e pegar: a data min, uma depois da data min, e uma depois dessa última...
segue a query final que está em produção hj (está nojenta, masss está funcionando e bem)
Selecionar tudo
SELECT
TB05.VTC_TECNOLOGIA TECNOLOGIA,
SUBSTR(TB01.HCM_ARQ_ORIGEM,0,3) LOTE,
COUNT(SUBSTR(TB01.HCM_ARQ_ORIGEM,0,3)) VOLUME_LOTE,
MIN(TBX.HORA_COLETA) HORA_COLETA,
MIN ( decode(tby.hora_inicio, null, tbx.hora_coleta, tby.hora_inicio) ) hora_inicio,
MAX ( decode(tbz.hora_fim, null, decode(tby.hora_inicio, null, tbx.hora_coleta, tby.hora_inicio), tbz.hora_fim) ) hora_fim,
COUNT(*) QUANTIDADE
FROM ms_historico_comando TB01
RIGHT JOIN
(
SELECT
HCM_ID_COMANDO,
MIN(HCM_DATA_EXEC) HORA_COLETA
FROM ms_historico_comando
WHERE ( HCM_DATA_EXEC >= (SELECT TO_DATE('26/03/2009','DD-MM-YYYY') FROM DUAL) AND HCM_DATA_EXEC < (SELECT TO_DATE('27/03/2009','DD-MM-YYYY') FROM DUAL) )
AND HCM_TIPO_ENTRADA = 1
GROUP BY HCM_ID_COMANDO
) TBX
ON TB01.HCM_ID_COMANDO = TBX.HCM_ID_COMANDO
AND TB01.HCM_DATA_EXEC = TBX.HORA_COLETA
LEFT OUTER JOIN
(
SELECT
TB_TEMP.HCM_ID_COMANDO,
MIN(TB_TEMP.HCM_DATA_EXEC) HORA_INICIO
FROM ms_historico_comando TB_TEMP
WHERE ( HCM_DATA_EXEC >= (SELECT TO_DATE('26/03/2009','DD-MM-YYYY') FROM DUAL) AND HCM_DATA_EXEC < (SELECT TO_DATE('27/03/2009','DD-MM-YYYY') FROM DUAL) )
AND TB_TEMP.HCM_DATA_EXEC >
(
select MIN(HCM_DATA_EXEC) from ms_historico_comando
WHERE ( HCM_DATA_EXEC >= (SELECT TO_DATE('26/03/2009','DD-MM-YYYY') FROM DUAL) AND HCM_DATA_EXEC < (SELECT TO_DATE('27/03/2009','DD-MM-YYYY') FROM DUAL) )
AND HCM_TIPO_ENTRADA = 1
AND TB_TEMP.hcm_id_comando = hcm_id_comando
)
GROUP BY HCM_ID_COMANDO
) TBY
ON TB01.HCM_ID_COMANDO = TBY.HCM_ID_COMANDO
LEFT OUTER JOIN
(
SELECT
TB_AUX_1.HCM_ID_COMANDO,
MIN(TB_AUX_1.HCM_DATA_EXEC) HORA_FIM
FROM ms_historico_comando TB_AUX_1
WHERE ( HCM_DATA_EXEC >= (SELECT TO_DATE('26/03/2009','DD-MM-YYYY') FROM DUAL) AND HCM_DATA_EXEC < (SELECT TO_DATE('27/03/2009','DD-MM-YYYY') FROM DUAL) )
AND TB_AUX_1.HCM_DATA_EXEC >
(
select MIN(HCM_DATA_EXEC) from ms_historico_comando TB_AUX_2
WHERE ( HCM_DATA_EXEC >= (SELECT TO_DATE('26/03/2009','DD-MM-YYYY') FROM DUAL) AND HCM_DATA_EXEC < (SELECT TO_DATE('27/03/2009','DD-MM-YYYY') FROM DUAL) )
AND TB_AUX_2.HCM_TIPO_ENTRADA = 1
AND TB_AUX_2.hcm_id_comando = TB_AUX_1.hcm_id_comando
AND TB_AUX_2.HCM_DATA_EXEC >
(
select MIN(HCM_DATA_EXEC) from ms_historico_comando
WHERE ( HCM_DATA_EXEC >= (SELECT TO_DATE('26/03/2009','DD-MM-YYYY') FROM DUAL) AND HCM_DATA_EXEC < (SELECT TO_DATE('27/03/2009','DD-MM-YYYY') FROM DUAL) )
AND HCM_TIPO_ENTRADA = 1
AND TB_AUX_2.hcm_id_comando = hcm_id_comando
)
)
GROUP BY HCM_ID_COMANDO
) TBZ
ON TB01.HCM_ID_COMANDO = TBZ.HCM_ID_COMANDO
LEFT OUTER JOIN MS_DEFIN_EXEC TB02
ON TB01.HCM_DEX_ID = TB02.DEX_ID
LEFT OUTER JOIN MS_VERSAO_TECNOLOGIA TB05
ON TB02.DEX_VTC_ID = TB05.VTC_ID
GROUP BY
TB05.VTC_TECNOLOGIA,
SUBSTR(TB01.HCM_ARQ_ORIGEM,0,3)
ORDER BY
TB05.VTC_TECNOLOGIA,
SUBSTR(TB01.HCM_ARQ_ORIGEM,0,3)
a idéia do rodrigo é legal... tem muita coisa aqui nesse formato...
pretendo fazer isso depois...
alguém tem mais alguma sugestão para a query?
[]´s
Alex