我有一个带有纪元值的表(每分钟一个,纪元本身以毫秒为单位)和温度。
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上工作。
答案 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
上的索引,该索引应该是主键(具有自动索引)。