max(value) 在 Postgres 9.3.5 上返回 1 个空行,适用于 8.4

max(value) returning 1 empty row on Postgres 9.3.5, works on 8.4

我有一个 table 具有纪元值(每分钟一个,纪元本身以毫秒为单位)和温度。

select * from outdoor_temperature order by time desc;
     time      | value
---------------+-------
 1423385340000 |  31.6
 1423385280000 |  31.6
 1423385220000 |  31.7
 1423385160000 |  31.7
 1423385100000 |  31.7
 1423385040000 |  31.8
 1423384980000 |  31.8
 1423384920000 |  31.8
 1423384860000 |  31.8
 [...]

我想在给定的一天中获得最高的单值,我是这样做的:

SELECT *
FROM
    outdoor_temperature
WHERE
    value = (
        SELECT max(value)
        FROM outdoor_temperature
        WHERE
            ((timestamp with time zone 'epoch' + (time::float/1000) * interval '1 second') at time zone 'Australia/Sydney')::date
            = '2015-02-05' at time zone 'Australia/Sydney'
    )
    AND
    ((timestamp with time zone 'epoch' + (time::float/1000) * interval '1 second') at time zone 'Australia/Sydney')::date
    = '2015-02-05' at time zone 'Australia/Sydney'
ORDER BY time DESC LIMIT 1;

在我的 Linode、运行 CentOS 5 和 Postgres 8.4 上,它 return 非常完美(我得到一个单一的值,在那个日期内,最高温度)。然而,在装有 Postgres 9.3.5 的 MacBook Pro 上,针对完全相同数据的完全相同查询不会 return 任何东西。我开始简化一切以找出问题所在,然后来到这里:

 SELECT max(value)
 FROM outdoor_temperature
 WHERE
     ((timestamp with time zone 'epoch' + (time::float/1000) * interval '1 second') at time zone 'Australia/Sydney')::date
     = '2015-02-05' at time zone 'Australia/Sydney';
  max
 -----

 (1 row)

它是空的,但 return 排成一行?!

我的问题是:

首先,为什么该查询针对 Postgres 8.4 工作,而在 9.3.5 上做一些不同的事情?

其次,是否有更简单的方法来实现我想要做的事情?我觉得应该有,但如果是这样,我还没有设法解决。这最终需要在 Postgres 8.4 上工作。

我不太确定你为什么没有得到结果 - 你似乎只是错过了今天的数据。

但是您确实应该使用另一个查询来 select 日期,因为您的查询将无法使用索引。

你应该select这样:

select max(value) from outdoor_temperature where
  time>=extract(
    epoch from
      '2015-02-05'::timestamp at time zone 'Australia/Sydney'
  )
  and
  time<extract(
    epoch from
      ('2015-02-05'::timestamp+'1 day'::interval) at time zone 'Australia/Sydney'
  )
;

这要简单得多,这样您的数据库就可以在 time 上使用索引,它应该是主键(具有自动索引)。​​