Ambiente: PostgreSQL v10.6 (instância do AWS RDS) Para a tabela fornecida:
CREATE temp TABLE lve
("fin" timestamptz, "vehiculo" int, "equipo" int)
;
INSERT INTO lve
("fin", "vehiculo", "equipo")
VALUES
('2021-12-01 00:00:00', 1, 888),
(NULL, 3, 888),
('2021-05-01 00:00:00', 2, 888),
('2021-11-05 00:00:00', 10, 333),
(NULL, 9, 333),
('2021-09-05 00:00:00', 5, 333)
;
Eu preciso do último registro (pela coluna ' fin ') onde ' fin ' não é nulo, para cada valor em uma determinada lista de ' equipo '.
Para um único dado ' equipo ', esta consulta funciona:
select * from lve
where equipo = 333 and fin is not null
order by fin desc
limit 1
para dois ' equipo ' , com um UNION posso obter o resultado desejado:
(select * from lve
where equipo = 333 and fin is not null
order by fin desc
limit 1)
union
(select * from lve
where equipo = 888 and fin is not null
order by fin desc
limit 1);
resultado:
barbatana | veículo | equipar |
---|---|---|
2021-11-05 00:00:00.000 -0300 | 10 | 333 |
01-12-2021 00:00:00.000 -0300 | 1 | 888 |
Mas como na realidade a tabela contém muito mais dados para muitos outros vehiculo/equipo e posso ter uma lista com N ' equipo ' para consultar, não é ideal continuar adicionando vários UNIONs manualmente.
Existe uma maneira de reescrever isso em uma única consulta onde posso passar a lista/matriz de determinado ' equipo ' (888, 333, nnn)?
PD: Meu plano B é criar uma função que retorne meu registro desejado para um único ' equipo ' e depois usar isso com um array, mas eu realmente quero saber se isso pode ser feito da maneira que estou pedindo.
Obrigado.
Você pode usar row_number() para ordenar por fin para cada equipo e depois escolher o primeiro/último de lá:
Ver violino