环境:PostgreSQL v10.6(AWS RDS 实例)对于给定的表:
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)
;
对于给定的“ equipo ”列表中的每个值,我需要最后一条记录(按“ fin ”列),其中“ fin ”不为空。
对于单个给定的“ equipo ”,此查询有效:
select * from lve
where equipo = 333 and fin is not null
order by fin desc
limit 1
对于两个 ' equipo ' ,使用 UNION 我可以获得我想要的结果:
(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);
结果:
鳍 | 车辆 | 等价 |
---|---|---|
2021-11-05 00:00:00.000 -0300 | 10 | 333 |
2021-12-01 00:00:00.000 -0300 | 1 | 888 |
但实际上,由于该表包含许多其他车辆/equipo 的更多数据,并且我可以有一个包含 N ' equipo ' 的列表来查询,因此继续手动添加多个 UNION 并不是最佳选择。
有没有一种方法可以将其重写为单个查询,我可以只传递给定的“ equipo ”(888、333、nnn)的列表/数组?
PD:我的计划 B 是创建一个函数,为单个“ equipo ”返回我想要的记录,然后将它与数组一起使用,但我真的想知道这是否可以按照我要求的方式完成。
谢谢。
您可以使用 row_number() 按 fin 为每个equipo 排序,然后从那里选择第一个/最后一个:
见小提琴