将Postgres与下表(Sensor_data)一起使用:
_id | value | createdAt | updatedAt | SensorId
328545721 | {"value":"12.40"} | 2020-05-08 21:25:55+00 | 2020-05-08 21:26:06.575+00 | 644
328542532 | {"value":"12.41"} | 2020-05-08 21:20:55+00 | 2020-05-08 21:21:03.485+00 | 644
328539226 | {"value":"12.38"} | 2020-05-08 21:15:55+00 | 2020-05-08 21:16:02.068+00 | 644
328536044 | {"value":"12.40"} | 2020-05-08 21:10:55+00 | 2020-05-08 21:10:56.573+00 | 644
328533180 | {"value":"12.38"} | 2020-05-08 21:05:55+00 | 2020-05-08 21:06:08.519+00 | 644
328530133 | {"value":"12.36"} | 2020-05-08 21:00:55+00 | 2020-05-08 21:01:03.808+00 | 644
328524018 | {"value":"12.33"} | 2020-05-08 20:50:55+00 | 2020-05-08 20:50:59.278+00 | 644
328520823 | {"value":"12.27"} | 2020-05-08 20:45:55+00 | 2020-05-08 20:45:56.882+00 | 644
328517813 | {"value":"12.22"} | 2020-05-08 20:40:55+00 | 2020-05-08 20:41:09.067+00 | 644
328514598 | {"value":"12.24"} | 2020-05-08 20:35:55+00 | 2020-05-08 20:36:06.379+00 | 644
我想查询最大值并返回该值的updatedAt时间。
我可以发出以下查询:
select MAX((value ->> 'value')::float) from "Sensor_data";
并获得以下结果:
max
12.41
(1 row)
但是我该如何及时获取更新?
如果我发出: 从“ Sensor_data”中选择“ updatedAt”,MAX((value->>'value'):: float);
我收到以下错误:
ERROR: column "Sensor_data.updatedAt" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: select "updatedAt", MAX((value ->> 'value')::float) from "S...
我需要执行什么查询,并且如果大于一个最大值(即12.41),它将返回多于1行?
答案 0 :(得分:0)
您可以使用order by
:
select sd.*
from sensor_data sd
order by (value ->> 'value')::float desc
limit 1;
答案 1 :(得分:0)
如果您想允许平局,则排序还不够好,因为Postgres不支持with ties
和limit
。
您可以改用窗口函数:
select (value ->> 'value')::numeric max_value, updatedAt
from (
select
sd.*,
rank() over(order by (value ->> 'value')::numeric desc) rn
from sensor_data sd
) t
where rn = 1