在 SQLite 中工作的 SQL Group By 在 Postgres 中不起作用

发布时间:2021-03-05 18:27

此语句在 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 字符串)。

回答1

只需在派生表中选择最新读数即可。在 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 joindatetime > 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