此语句在 SQLite 中有效,但在 Postgres 中无效:
SELECT A.*, B.*
FROM Readings A
LEFT JOIN Offsets B ON A.MeterNum = B.MeterNo AND A.DateTime > B.TimeDate
WHERE A.MeterNum = 1
GROUP BY A.DateTime
ORDER BY A.DateTime DESC
读数表包含电表读数,每个读数都带有日期戳。 Offsets 表包含用户在故障仪表被替换为重新从零开始的新仪表后输入的调整。如果没有 Group By 语句,查询会为每个仪表读数返回一行,并在读数日期之前进行每次调整,而我只想要最后一次调整。
我在 Group By for Postgres 上看到的所有文档都表明我应该包含一个我不需要也不能使用的聚合函数(读数列包含从仪表返回的 Modbus 字符串)。>
只需在派生表中选择最新读数即可。在 Postgres 中,这可以使用 distinct on ()
SELECT A.*, B.*
FROM readings A
left join (
select distinct on (meterno) o.*
from offsets o
order by o.meterno, o.timedate desc
) B ON A.MeterNum = B.MeterNo AND A.DateTime > B.TimeDate
WHERE A.meternum = 1
ORDER BY A.DateTime DESC
distinct on ()
每米只返回一行,这是“最新”行,因为 order by ... , timedate desc
通过使用 lateral join 将 datetime > timedate
上的条件推送到派生表中,查询速度甚至可能更快:
SELECT A.*, B.*
FROM readings A
left join lateral (
select distinct on (meterno) o.*
from offsets o
where a.datetime > o.timedeate
order by o.meterno, o.timedate desc
) B ON A.MeterNum = B.MeterNo
WHERE A.meternum = 1
ORDER BY A.DateTime DESC