Postgresql 如何使用left join PSQL获取电池的上次添加记录

Postgresql 如何使用left join PSQL获取电池的上次添加记录,postgresql,psql,Postgresql,Psql,我有这样的疑问 select * from batteries as b ORDER BY inserted_at desc select voltage, datetime, battery_id from battery_readings ORDER BY inserted_at desc limit 1 这给了我一些数据,比如 我有一个问题,比如 select * from batteries as b ORDER BY inserted_at desc select voltag

我有这样的疑问

select * from batteries as b ORDER BY inserted_at desc
select voltage, datetime, battery_id from battery_readings ORDER BY inserted_at desc limit 1
这给了我一些数据,比如

我有一个问题,比如

select * from batteries as b ORDER BY inserted_at desc
select voltage, datetime, battery_id from battery_readings ORDER BY inserted_at desc limit 1
它返回的数据为


我想结合以上两个查询,这样一次就可以从电池读数中获得每个电池的详细信息以及最后添加的电压和日期时间。

我认为丧偶会达到你的预期

假设两张桌子

create table battery (id int, name text);
create table bat_volt(measure_time int, battery_id int, val int);
可能的查询之一如下所示:

with latest as (select battery_id, max(measure_time) over (partition by battery_id) from bat_volt)
  select * from battery b join bat_volt bv on bv.battery_id=b.id where (b.id,bv.measure_time) in (select * from latest);
SELECT DISTINCT ON (b.id)
  b.id,
  b.name,
  b.source_url,
  b.active,
  b.user_id,
  b.inserted_at,
  b.updated_at,
  v.voltage,
  v.datetime
FROM battery b
JOIN battery_voltage v ON (b.id = v.battery_id)
ORDER BY b.id, v.datetime desc;
如果您有支持侧向的Postgres版本,那么也可以尝试一下(如果有比电池更多的价值,它可能会有更好的性能)


Postgres有一个非常有用的语法,称为
DISTINCT ON
。这与普通的DISTINCT不同,因为它只保留每个集合的第一行,由排序顺序定义。在您的情况下,可能是这样的:

with latest as (select battery_id, max(measure_time) over (partition by battery_id) from bat_volt)
  select * from battery b join bat_volt bv on bv.battery_id=b.id where (b.id,bv.measure_time) in (select * from latest);
SELECT DISTINCT ON (b.id)
  b.id,
  b.name,
  b.source_url,
  b.active,
  b.user_id,
  b.inserted_at,
  b.updated_at,
  v.voltage,
  v.datetime
FROM battery b
JOIN battery_voltage v ON (b.id = v.battery_id)
ORDER BY b.id, v.datetime desc;