Bases de datos

SQL Server

Consulta ejemplo de "último caso por referencia"

Última actualización: 19-11-2017 19:49

Para este ejemplo se crea una tabla de "personas" y otra de "entradas por persona".

Se rellenan con registros estas tablas. Notar que el señor MARX no cuenta con registros de entradas.

A continuación está el SELECT que muestra cuál es la última entrada de cada persona.

Para el caso del señor MARX aparece con valor nulo... Porque no hay registro de sus entradas.

if exists (select * from sys.objects where name = 'zzz_entradaxpersona') drop table zzz_entradaxpersona;
if exists (select * from sys.objects where name = 'zzz_persona') drop table zzz_persona;
 
create table zzz_persona (ID int identity (1, 1) not null, NOMBRE varchar(100), primary key (ID));
create table zzz_entradaxpersona 
(
	ID int identity (1, 1), 
	PERSONA_ID int, 
	HORA datetime not null, 
	primary key (ID), 
	constraint fk_entradaxpersona_persona foreign key (PERSONA_ID) references zzz_persona (ID)
);
go
 
set nocount on;
 
insert into zzz_persona (NOMBRE) values ('JUAN'), ('PACO'), ('PEDRO'), ('MAR'), ('MARX'); 
insert into zzz_entradaxpersona (PERSONA_ID, HORA) 
values (1, '2017-11-11 15:00'), (1, '2017-11-12 15:01'), (1, '2017-11-13 14:59'),
		(2, '2017-11-11 14:30'), (2, '2017-11-12 15:10'), (2, '2017-11-13 14:50'),
		(3, '2017-11-10 20:00'), (3, '2017-11-12 20:05'), (3, '2017-11-13 20:10'),
		(4, '2017-11-12 15:30'), (4, '2017-11-12 18:22'), (4, '2017-11-12 20:59');
 
set nocount off;
 
select a.ID, a.NOMBRE, b.ULTIMA_ENTRADA 
from zzz_persona a
	left outer join (	select PERSONA_ID, max(HORA) as ULTIMA_ENTRADA 
						from zzz_entradaxpersona 
						group by PERSONA_ID
					) b on b.PERSONA_ID = a.ID;
 
go
 
if exists (select * from sys.objects where name = 'zzz_entradaxpersona') drop table zzz_entradaxpersona;
if exists (select * from sys.objects where name = 'zzz_persona') drop table zzz_persona;
go
 
 

Resultado

ID          NOMBRE  ULTIMA_ENTRADA
----------- ------- -----------------------
1           JUAN    2017-11-13 14:59:00.000
2           PACO    2017-11-13 14:50:00.000
3           PEDRO   2017-11-13 20:10:00.000
4           MAR     2017-11-12 20:59:00.000
5           MARX    NULL

(5 row(s) affected)