max(value)在Postgres 9.3.5上返回1个空行,在8.4上工作

时间:2015-02-08 09:07:18

标签: postgresql max postgresql-9.3 postgresql-8.4

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

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,它返回完美(我得到一个值,在该日期内,具有最高温度)。但是,对于使用Postgres 9.3.5的MacBook Pro,对完全相同的数据完全相同的查询不会返回任何内容。我开始简化一切以找出出错的地方,然后到了这里:

 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)

它是空的,然后返回一行?!

我的问题是:

首先,为什么该查询针对Postgres 8.4并在9.3.5上做了不同的事情?

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

1 个答案:

答案 0 :(得分:1)

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

但是你真的应该使用另一个查询来选择日期,因为你的查询将无法使用索引。

你应该这样选择:

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上的索引,该索引应该是主键(具有自动索引)。​​