Cálculo Média de Tempo em Query

DBA Geral (instalação, configuração do banco, scripts do Sql*Plus, shell scripts, batch scripts, etc...)
  

Mensagemem Qua, 13 Jun 2018 5:34 pm

Prezados boa tarde.

Tenho uma query que utilizo em um painel de indicadores do sistema do hospital em que trabalho onde os usuários responsáveis solicitaram um alteração onde se inclua uma média nos tempos conforme o andamento do atendimento dos pacientes. A query utilizada atualmente é esta abaixo:

Código: Selecionar todos
SELECT
    TA.DS_SENHA             SENHA_PACIENTE          ,
    CASE WHEN   A.CD_ATENDIMENTO    IS  NULL    THEN    TA.NM_PACIENTE  ELSE    P.NM_PACIENTE   END NOME_PACIENTE           ,
    TO_DATE(TA.DH_PRE_ATENDIMENTO               ,               'DD/MM/RRRR')                       DATA_RETIRADA_SENHA     ,
    TO_CHAR(TA.DH_PRE_ATENDIMENTO               ,               'HH24:MI:SS')                       HORA_SENHA              ,
    TO_DATE(TA.DH_CHAMADA_CLASSIFICACAO         ,               'DD/MM/RRRR')                       CHAMADA_TRIAGEM         ,
    TO_CHAR(TA.DH_CHAMADA_CLASSIFICACAO         ,               'HH24:MI:SS')                       HORA_TRIAGEM            ,
    TA.CD_TRIAGEM_ATENDIMENTO NUM_TRIAGEM       ,
    CASE WHEN   TA.DH_REMOVIDO      IS  NULL    THEN    'N'     ELSE    'S'     END                 TRIAGEM_REMOVIDA        ,
    TO_DATE(TA.DH_PRE_ATENDIMENTO_FIM           ,               'DD/MM/RRRR')                       FIM_TRIAGEM             ,
    TO_CHAR(TA.DH_PRE_ATENDIMENTO_FIM           ,               'HH24:MI:SS')                       HORA_FIM_TRIAGEM        ,
    TO_DATE(A.HR_ATENDIMENTO                    ,               'DD/MM/RRRR')                       DATA_ATENDIMENTO        ,
    TO_CHAR(A.HR_ATENDIMENTO                    ,               'HH24:MI:SS')                       HORA_ATENDIMENTO        ,
    A.CD_ATENDIMENTO                                                                                NUM_ATENDIMENTO         ,
    TO_DATE(MIN(PW.DH_CRIACAO)                  ,               'DD/MM/RRRR')                       CHAMADA_MEDICO          ,
    TO_CHAR(MIN(PW.DH_CRIACAO)                  ,               'HH24:MI:SS')                       HORA_CHAMADA            ,
    TO_DATE(A.DT_ALTA                           ,               'DD/MM/RRRR')                       DATA_ALTA               ,
    TO_CHAR(A.DT_ALTA                           ,               'HH24:MI:SS')                       HORA_ALTA               ,
    SR.NM_COR                                   ,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(TA.DH_CHAMADA_CLASSIFICACAO,'dd/mm/yyyy hh24:mi:ss'))  -
                    TO_TIMESTAMP(TO_CHAR(TA.DH_PRE_ATENDIMENTO,'dd/mm/yyyy hh24:mi:ss'      ))  ,           11,9    )   TEMPO_SENHA_TRIAGEM      ,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(TA.DH_PRE_ATENDIMENTO_FIM,'dd/mm/yyyy hh24:mi:ss'  ))  -
                    TO_TIMESTAMP(TO_CHAR(TA.DH_CHAMADA_CLASSIFICACAO,'dd/mm/yyyy hh24:mi:ss'))  ,           11,9    )   TEMPO_FIM_TRIAGEM        ,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(A.HR_ATENDIMENTO,'dd/mm/yyyy hh24:mi:ss'           ))  -
                    TO_TIMESTAMP(TO_CHAR(TA.DH_PRE_ATENDIMENTO_FIM,'dd/mm/yyyy hh24:mi:ss'  ))  ,           11,9    )   TEMPO_TRIAGEM_ATENDIMENTO,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(MIN(PW.DH_CRIACAO),'dd/mm/yyyy hh24:mi:ss'         ))  -
                    TO_TIMESTAMP(TO_CHAR(A.HR_ATENDIMENTO,'dd/mm/yyyy hh24:mi:ss'           ))  ,           11,9    )   TEMPO_CHAMADA_MEDICO     ,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(A.DT_ALTA,'dd/mm/yyyy hh24:mi:ss'                  ))  -
                    TO_TIMESTAMP(TO_CHAR(MIN(PW.DH_CRIACAO),'dd/mm/yyyy hh24:mi:ss'         ))  ,           11,9    )   TEMPO_FIM_CHAMADA        ,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(MIN(PW.DH_CRIACAO),'dd/mm/yyyy hh24:mi:ss'         ))  -
                    TO_TIMESTAMP(TO_CHAR(TA.DH_CHAMADA_CLASSIFICACAO,'dd/mm/yyyy hh24:mi:ss'))  ,           11,9    )   TEMPO_TRIAGEM_CHAMADA    ,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(A.DT_ALTA,'dd/mm/yyyy hh24:mi:ss'                  ))  -
                    TO_TIMESTAMP(TO_CHAR(TA.DH_PRE_ATENDIMENTO,'dd/mm/yyyy hh24:mi:ss'      ))  ,           11,9    )   TEMPO_TOTAL_ATENDIMENTO             
                   
FROM        DBAMV.TRIAGEM_ATENDIMENTO       TA
   LEFT     JOIN    DBAMV.ATENDIME          A   ON  A.CD_ATENDIMENTO        =   TA.CD_ATENDIMENTO   AND A.TP_ATENDIMENTO    =   'U'
   LEFT     JOIN    DBAMV.PACIENTE          P   ON  A.CD_PACIENTE           =   P.CD_PACIENTE
   LEFT     JOIN    PW_DOCUMENTO_CLINICO    PW  ON  A.CD_ATENDIMENTO        =   PW.CD_ATENDIMENTO
   LEFT     JOIN    SACR_COR_REFERENCIA     SR  ON  TA.CD_COR_REFERENCIA    =   SR.CD_COR_REFERENCIA
WHERE
    ((TRUNC(A.DT_ATENDIMENTO)       >   =   '04/04/2017'    AND TRUNC   (A.DT_ATENDIMENTO)      <   =   '04/04/2017'    OR
    ((TRUNC(TA.DH_PRE_ATENDIMENTO)  >   =   '04/04/2017'    AND TRUNC   (TA.DH_PRE_ATENDIMENTO) <   =   '04/04/2017'    )
    AND TA.CD_FILA_SENHA    =   1   ))      AND
    CASE    WHEN    TA.DH_REMOVIDO      IS  NULL    THEN    'N' ELSE    'S' END IN  'N' )
GROUP BY
    A.CD_ATENDIMENTO                ,
    A.HR_ATENDIMENTO                ,
    TA.DS_SENHA                     ,
    A.DT_ALTA                       ,
    CASE    WHEN    A.CD_ATENDIMENTO    IS  NULL    THEN    TA.NM_PACIENTE  ELSE    P.NM_PACIENTE   END     ,
    TA.CD_TRIAGEM_ATENDIMENTO       ,
    TA.DH_PRE_ATENDIMENTO           ,
    TA.DH_PRE_ATENDIMENTO_FIM       ,
    TA.DH_CHAMADA_CLASSIFICACAO     ,
    CASE    WHEN    TA.DH_REMOVIDO      IS  NULL    THEN    'N'             ELSE    'S'             END     ,
    SR.NM_COR
ORDER BY NOME_PACIENTE;


Percebam que os tempos de atendimento estão representados da query como tempo2 - tempo1:
Código: Selecionar todos
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(TA.DH_CHAMADA_CLASSIFICACAO,'dd/mm/yyyy hh24:mi:ss'))  -
                    TO_TIMESTAMP(TO_CHAR(TA.DH_PRE_ATENDIMENTO,'dd/mm/yyyy hh24:mi:ss'      ))  ,           11,9    )   TEMPO_SENHA_TRIAGEM      ,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(TA.DH_PRE_ATENDIMENTO_FIM,'dd/mm/yyyy hh24:mi:ss'  ))  -
                    TO_TIMESTAMP(TO_CHAR(TA.DH_CHAMADA_CLASSIFICACAO,'dd/mm/yyyy hh24:mi:ss'))  ,           11,9    )   TEMPO_FIM_TRIAGEM        ,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(A.HR_ATENDIMENTO,'dd/mm/yyyy hh24:mi:ss'           ))  -
                    TO_TIMESTAMP(TO_CHAR(TA.DH_PRE_ATENDIMENTO_FIM,'dd/mm/yyyy hh24:mi:ss'  ))  ,           11,9    )   TEMPO_TRIAGEM_ATENDIMENTO,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(MIN(PW.DH_CRIACAO),'dd/mm/yyyy hh24:mi:ss'         ))  -
                    TO_TIMESTAMP(TO_CHAR(A.HR_ATENDIMENTO,'dd/mm/yyyy hh24:mi:ss'           ))  ,           11,9    )   TEMPO_CHAMADA_MEDICO     ,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(A.DT_ALTA,'dd/mm/yyyy hh24:mi:ss'                  ))  -
                    TO_TIMESTAMP(TO_CHAR(MIN(PW.DH_CRIACAO),'dd/mm/yyyy hh24:mi:ss'         ))  ,           11,9    )   TEMPO_FIM_CHAMADA        ,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(MIN(PW.DH_CRIACAO),'dd/mm/yyyy hh24:mi:ss'         ))  -
                    TO_TIMESTAMP(TO_CHAR(TA.DH_CHAMADA_CLASSIFICACAO,'dd/mm/yyyy hh24:mi:ss'))  ,           11,9    )   TEMPO_TRIAGEM_CHAMADA    ,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(A.DT_ALTA,'dd/mm/yyyy hh24:mi:ss'                  ))  -
                    TO_TIMESTAMP(TO_CHAR(TA.DH_PRE_ATENDIMENTO,'dd/mm/yyyy hh24:mi:ss'      ))  ,           11,9    )   TEMPO_TOTAL_ATENDIMENTO


Para cada etapa no atendimento será necessário calcular a média do tempo decorrido entre cada uma das etapas representadas no código acima mas não estou sabendo montar o calculo da media tendo em vista que o comando AVG retorna erro.

Vocês poderiam me ajudar?

Agradeço desde já!
silvadouglas

Mensagemem Sex, 15 Jun 2018 8:39 am

Opa,
1)
Não entendo o porquê de fazer isso:
TO_TIMESTAMP(TO_CHAR(TA.DH_CHAMADA_CLASSIFICACAO,'dd/mm/yyyy hh24:mi:ss')) se TA.DH_CHAMADA_CLASSIFICACAO possui data e hora. Está fazendo conversões à toa que atrapalham o tempo e visualização.

2)
Sobre cálculo em cima de horas e diferenças :
http://glufke.net/oracle/viewtopic.php?f=3&t=8286&p=32892&hilit=diferen%C3%A7a#p32892
e
http://glufke.net/oracle/viewtopic.php?f=2&t=7208&p=33353&hilit=diferen%C3%A7a#p33353

Qualquer dúvida ainda é só falar.
DanielNN
Localização: Fortaleza - CE

att,

Daniel N.N.



Voltar para DBA Geral

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 5 visitantes

cron