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
上使用索引,它应该是主键(具有自动索引)。
我有一个 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
上使用索引,它应该是主键(具有自动索引)。