Jump to content
Ricardo de Souza Rodrigues

Comparação de dados (Linhas de uma tabela)

Recommended Posts

Prezados,  boa tarde. 

Tenho o seguinte script que me apresenta uma lista com todos os pacientes que tiveram mais de uma passagem por determinado setor.  Abaixo segue exemplo de 4 registros do resultado:

 

11/2018    60574    211701    12/11/2018      01/11/2018      14/11/2018  
11/2018    61038    211701    21/11/2018      01/11/2018      22/11/2018 
10/2018    59506    208314    25/10/2018      01/10/2018      27/10/2018  
10/2018    59703    208314    28/10/2018      01/10/2018      29/10/2018  

 

Como podem ver tenho dois registros do atendimento 211701 e dois registros do atendimento 208314, cada um com um código de movimentação único (significando que o segundo registro é uma reinternação). 

A minha necessidade é apresentar apenas o registro de reinternação que for em no máximo 2 dias, ou seja, a data da reinternação (DT_MOV_INT ) tem que ser menor que a data da liberação da primeira entrada (DT_LIB_MOV ) + 2 (DT_MOV_INT < DT_LIB_MOV + 2). 

 

SELECT 
     TO_CHAR(MI.DT_MOV_INT,'MM/YYYY') MES
    ,MI.CD_MOV_INT
    ,MI.CD_ATENDIMENTO 
    ,MI.DT_MOV_INT
    ,MI.HR_MOV_INT
    ,MI.DT_LIB_MOV
FROM MOV_INT MI
  INNER JOIN 
    (
    SELECT 
        --COUNT(M.CD_ATENDIMENTO),
        M.CD_ATENDIMENTO
    FROM  MOV_INT M 
      INNER JOIN LEITO L
        ON M.CD_LEITO = L.CD_LEITO
      INNER JOIN UNID_INT U
        ON L.CD_UNID_INT = U.CD_UNID_INT
    WHERE 
        U.CD_UNID_INT = 67
        AND M.CD_ATENDIMENTO IS NOT NULL
        AND M.CD_LEITO_ANTERIOR NOT IN (243,242,166,165,164,163,162,161,160,159)
        AND M.CD_LEITO_ANTERIOR IS NOT NULL
    GROUP BY M.CD_ATENDIMENTO
    HAVING COUNT(M.CD_ATENDIMENTO) > 1
    ORDER BY M.CD_ATENDIMENTO DESC
    ) ATEND
     ON MI.CD_ATENDIMENTO = ATEND.CD_ATENDIMENTO
    INNER JOIN LEITO L -- tabela de leitos
     ON MI.CD_LEITO = L.CD_LEITO
    INNER JOIN UNID_INT U -- tabela de unidades de internação
     ON L.CD_UNID_INT = U.CD_UNID_INT
WHERE U.CD_UNID_INT = 67
 AND MI.CD_ATENDIMENTO IS NOT NULL
 AND MI.CD_LEITO_ANTERIOR NOT IN (243,242,166,165,164,163,162,161,160,159)
 AND MI.CD_LEITO_ANTERIOR IS NOT NULL
ORDER BY 3 DESC;

 

Share this post


Link to post
Share on other sites

Por que a query interna (tabela virtual) tem joins ?

Eu faria um EXISTS  em uma subquery

 

SELECT *
FROM MOV_INT MI
WHERE EXISTS (SELECT NULL
              FROM MOV_INT MI2
              WHERE MI2.CD_ATENDIMENTO  = MI.CD_ATENDIMENTO 
              AND (MI.DT_MOV_INT < MI2DT_LIB_MOV + 2))

 

Share this post


Link to post
Share on other sites
1 hora atrás, Motta disse:

Por que a query interna (tabela virtual) tem joins ?

Eu faria um EXISTS  em uma subquery

 


SELECT *
FROM MOV_INT MI
WHERE EXISTS (SELECT NULL
              FROM MOV_INT MI2
              WHERE MI2.CD_ATENDIMENTO  = MI.CD_ATENDIMENTO 
              AND (MI.DT_MOV_INT < MI2DT_LIB_MOV + 2))

 

Na query interna quero identificar quem tem mais de uma passagem pela unidade de internação 67. Depois de identificar esses atendimento, faço o join com a tabela de movimentações para apenas destes apresentar os dados que preciso, ou seja, alguns vão ter duas linhas, outros três linhas, de acordo com quantas vezes retornou a unidade de internação 67 no mesmo atendimento. 

 

Porém não consegui identificar como posso fazer aquela análise do período entre essas repetições.

 

Tentei executar a query informada, mas deu erro.

 

ORA-00911: caractere inválido
00911. 00000 -  "invalid character"
*Cause:    identifiers may not start with any ASCII character other than
           letters and numbers.  $#_ are also allowed after the first
           character.  Identifiers enclosed by doublequotes may contain
           any character other than a doublequote.  Alternative quotes
           (q'#...#') cannot use spaces, tabs, or carriage returns as
           delimiters.  For all other contexts, consult the SQL Language
           Reference Manual.

Share this post


Link to post
Share on other sites

Os dois dias tem de seguir a mesma regra de unidade , leito etc ?

 

 

Share this post


Link to post
Share on other sites

Então... Pensando no que preciso... 

Preciso de todos os atendimentos que tiveram mais de uma passagem na UTI (U.CD_UNID_INT = 67) e que o leito anterior não tenha sido da UTI (CD_LEITO_ANTERIOR NOT IN (243,242,166,165,164,163,162,161,160,159)), pois as vezes ele transfere de leito dentro da própria UTI.

Ai esse script me traz todos esses atendimentos apresentando os que tem mais de uma incidência na UTI após outro leito sem ser UTI. 

Mas ai não sei como comparo para ver se a data de entrada do registro 2 é maior ou igual que a saída do registro 1 + 2 (ou mais 3 - regra para definir em quantos dias voltou).

Ficou claro?

Share this post


Link to post
Share on other sites

Faça a sua query ser uma tabela virtual e a compareca uma cópia dela mesma , eu pensaria o caso de criar uma view dela , é bom no caso de queries complicadas pois o sql fica simples.

 

Em regras muito complicadas também se pode pensar o caso de uma FUNCTION que retorne uma condição de reinternação , já fiz algo parecido até para reinternação hospitalar mesmo.

 

A vantagem da FUNCTION é poder ter cursor etc , só tome cuidado para ela ser otimizada e rápida.

Share this post


Link to post
Share on other sites
13 horas atrás, Motta disse:

Faça a sua query ser uma tabela virtual e a compareca uma cópia dela mesma , eu pensaria o caso de criar uma view dela , é bom no caso de queries complicadas pois o sql fica simples.

 

Em regras muito complicadas também se pode pensar o caso de uma FUNCTION que retorne uma condição de reinternação , já fiz algo parecido até para reinternação hospitalar mesmo.

 

A vantagem da FUNCTION é poder ter cursor etc , só tome cuidado para ela ser otimizada e rápida.

Fiz a view e deu certo. Show de bola!

Obrigado pelo apoio.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By oomaikoo
      Boa noite pessoal, estou tentando fazer um código, para mostrar um banner em meu site, quando o usuário entrar, baseado na localização dele. É basicamente o seguinte: a API de geolocalização retorna o nome da cidade, e, se for a cidade, então mostre o banner. Se não for, mostre outro. O código JavaScript que estou usando é esse:
      <script type="application/javascript"> function geoip(json){ var city = document.getElementById("user_city"); city.textContent = json.city; } </script> <script async src="https://get.geojs.io/v1/ip/geo.js"></script> A cidade é: <span id="user_city"></span>

      Esse código retorna o nome da cidade no <span id>.

      Porém eu preciso fazer um IF, ELSE no próprio JavaScript, para mostrar o banner ou não. Seria basicamente assim:
      <script type="application/javascript"> function geoip(json){ var city = document.getElementById("user_city"); city.textContent = json.city; } if (city == "nomedacidade") { document.write ("<img src='banner1.jpg'></img>"); } else { document.write ("<img src='banner2.jpg'></img>"); } </script> <script async src="https://get.geojs.io/v1/ip/geo.js"></script>

      O problema é que a variável city não fica setada dentro do if, não retorna o nome da cidade, eu só queria comparar no if o nome da cidade com o que a API retorna.
      Alguém tem alguma ideia?
    • By Marxrj
      Galera, tenho um carrossel no meu arquivo, porém queria que elas mudassem aleatóriamente a cada refresh na página, pois ela s´fica pela ordem normal.
      <div> <div> <div class="loop owl-carousel owl-theme"> <div> <img src="imagens/jpeg.01"> </div> <div> <img src="imagens/jpeg.02"> </div> <div> <img src="imagens/jpeg.03"> </div> <div> <img src="imagens/jpeg.01"> </div> <div> <img src="imagens/jpeg.05"> </div> <div> <img src="imagens/jpeg.07"> </div> <div> <img src="imagens/jpeg.07"> </div> </div>  
    • By Dinho Nunes LC
      <div align="center" id="subtitulo"> Canais Abertos </div> <div class="ui cards"> <div class="card"> <div class="content"> <a href="globo.html" style="display: block; color: black"> <div align="center"> <div> <img class="ui tiny image" id="imagem_card_casa" src="assets/images/Rede_Globo_2014.png"> <div align="center" id = "nome_time_fora"> <b>Globo RJ</b> </div> </div> Onde "globo.html" seria substituído pelo link que esta em uma tabela do banco de dados.
       
      Já fiz a conexão. E tenho a base de dados pronta.
       
      Motivo pelo qual estou buscando ajuda:
       
      Faço manualmente a mudança de cada link (são mais de 300) diariamente para evitar copias de terceiros. Sendo assim poderia usar um CRUD para facilitar a troca dos links direto no banco de dados.
    • By jeanzinsousa
      Salve, Galera estou com uma dúvida estudando banco de dados e programação.
       
      escrevi a seguinte query:
       
      SELECT data_pg as diaria, SUM(valor_pg) as valor_diario, SUM(valor_despesa) as valor_despesa, (SELECT SUM(valor_pg) as dinheiro FROM pagamento WHERE tipo = 5 AND MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019) as total_dinheiro, (SELECTSUM(valor_pg) as debito FROM pagamento WHERE tipo = 25 AND MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019) as total_debito, (SELECT SUM(valor_pg) as credito FROM pagamento WHERE tipo = 15 AND MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019) astotal_credito FROM pagamento WHERE MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019 GROUP BY diaria ORDER BY `diaria`
       
      resultado:
      diaria  1 valor_diario valor_despesa total_dinheiro total_debito total_credito   2019-06-10 818.70 0 288.40 586.95 113.30 2019-06-11 169.95 0 288.40 586.95 113.30
       
       
       
       
      Como podem ver meu objetivo e separar por dia o resultado dos valores divididos por tipo de pagamento.
      porém o mesmo mostra a soma total nas subquery.
      quando coloco o group by order by dentro das subquerys apresenta a seguinte mensagem de erro: #1242 - Subquery returns more than 1 row 
       
       
      como resolver?
    • By JorgeeHenrique
      Bom dia, sou iniciante em Delphi, estou fazendo um Cadastro de Clientes, gostaria de usar três Edit´s para filtrar alguns  dados porem com o código abaixo consegui fazer apenas com 1 edit.text, como faço pra usar três e que se algum estiver em branco ele retorna o valor apenas do Edit.text que foi preenchido?
       
      Exemplo: 
       
      Quero buscar por Nome, Situação e Rota (Cliente a da rota B com situação C) e se algum desses campos estiver vazio ele busca apenas o que foi preenchido. Obrigado pela atenção!
       
      .
      procedure TFrm_Cadastro.Bt_BuscarClick(Sender: TObject); begin with Frm_Cadastro.Tbl_Clientes do begin Close; SQL.Clear; SQL.Add( 'Select * from Tbl_Cad_Clientes'); SQL.Add('where Cli_Nome like :nome'); ParamByName('nome').Value := '%' + txt_buscar_nome.Text + '%'; Open; end; end;  
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.