Postgres:查找具有最大值的行

Posted

技术标签:

【中文标题】Postgres:查找具有最大值的行【英文标题】:Postgres: Find row(s) with Maximum value 【发布时间】:2020-08-24 13:35:15 【问题描述】:

将 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)

但是我怎样才能得到更新的时间呢?

如果我发出: select "updatedAt", MAX((value ->> 'value')::float) from "Sensor_data";

我收到以下错误:

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 行吗?

【问题讨论】:

【参考方案1】:

如果你想允许排名靠前,那么排序就不够好,因为 Postgres 不支持 with tieslimit

您可以改用窗口函数:

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

【讨论】:

【参考方案2】:

你可以使用order by:

select sd.*
from sensor_data sd
order by (value ->> 'value')::float desc
limit 1;

【讨论】:

以上是关于Postgres:查找具有最大值的行的主要内容,如果未能解决你的问题,请参考以下文章

在根据最大列值理解行的同时查找具有最高值的行的列名

使用 Activerecord、Rails 和 Postgres 查找具有多个重复字段的行

从 Postgres 记录中的行中获取最大值并按多列分组

在给定最大值的情况下查找表的行名[重复]

使用 Pandas 查找列的最大值并返回相应的行值

Postgres 在 groupby 和 max 之后选择 *