GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

MAX retornando todos os registros

sql
banco
Tags: #<Tag:0x00007fb3a3566748> #<Tag:0x00007fb3a35665e0>

#1

Ao executar esse select eu esperava que o resultado fosse apenas 1 registro, o registro que tem a maior data, mas o banco me retorna os 4 registros existentes e eu só quero o MAX.

O que eu entendi é que ele faz isso porque eu tenho l.ds_leito e ui.ds_unid_int no group by, mas como eu faço para ter apenas o ultimo registro de cada atendimento pela data?

select
          max(mi.dt_mov_int) as dt_mov_int
          ,p.cd_paciente cd_paciente
          ,a.cd_atendimento cd_atendimento
          ,l.ds_leito ds_leito
          ,ui.ds_unid_int ds_unid_int

          from atendime a

          join paciente p on p.cd_paciente = a.cd_paciente
          join mov_int mi on mi.cd_atendimento = a.cd_atendimento
          join leito l on l.cd_leito = mi.cd_leito
          join unid_int ui on ui.cd_unid_int = l.cd_unid_int 

          where a.dt_alta is null
          and a.tp_atendimento = 'I'
          and p.cd_paciente = '1774836'

          group by p.cd_paciente
          ,a.cd_atendimento
          ,l.ds_leito
          ,ui.ds_unid_int

          order by 
           dt_mov_int desc , cd_atendimento 

Resultado:
| 28/09/2018 | 1774836 | 15 | 311-LEITO04 |
| 06/05/2018 | 1774836 | 15 | 311-LEITO01 |
| 04/05/2018 | 1774836 | 15 | 518-LEITO10 |
| 25/12/2017 | 1774836 | 15 | 311-LEITO04 |


#2

Ao invés de acionar o max no próprio select e fazer agrupamento, tenta fazer um subselect na cláusula where aplicando o max pela data!

Exemplo:

SELECT
	MI.DT_MOV_INT,
	P.CD_PACIENTE,
	A.CD_ATENDIMENTO,
	L.DS_LEITO,
	UI.DS_UNID_INT
FROM 
	ATENDIME A
INNER JOIN 
	PACIENTE P 
		ON(P.CD_PACIENTE = A.CD_PACIENTE)
INNER JOIN 
	MOV_INT MI 
		ON(MI.CD_ATENDIMENTO = A.CD_ATENDIMENTO)
INNER JOIN 
	LEITO L 
		ON(L.CD_LEITO = MI.CD_LEITO)
INNER JOIN 
	UNID_INT UI 
		ON(UI.CD_UNID_INT = L.CD_UNID_INT)
WHERE 
	A.DT_ALTA IS NULL
AND A.TP_ATENDIMENTO = 'I'
AND P.CD_PACIENTE = '1774836'
AND MI.DT_MOV_INT = (SELECT 
						MAX(DT_MOV_INT) 
					 FROM 
						MOV_INT
					 WHERE
						CD_ATENDIMENTO = A.CD_ATENDIMENTO)
ORDER BY 
MI.DT_MOV_INT DESC, A.CD_ATENDIMENTO

#3

limit 0,1 não resolveria?


#4

Neste caso em que são registros distintos não, ao utilizar limit estaríamos criando uma pseudo-informação!


#5

Jonathan, muito obrigado pela resposta. Foi fatal, fiz inclusive umas melhorias no meu código e já resolvi minha vida.

Até a próxima!