Postgres: найти строку (строки) с максимальным значением - PullRequest
2 голосов
/ 09 мая 2020

Используя 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

Я хочу запросить максимальное значение и вернуть обновленное время для этого значения.

Я могу выдать следующий запрос:

select MAX((value ->> 'value')::float)  from "Sensor_data";

И получите следующий результат:

max
12.41
(1 row)

но как я могу получить обновленныйAt time с этим?

Если я выдам: выберите "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...

Что мне нужно сделайте этот запрос, и если больше одного максимального значения (ie 12,41), вернет ли он более 1 строки?

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Если вы хотите разрешить верхние привязки, сортировки недостаточно, поскольку 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
0 голосов
/ 09 мая 2020

Вы можете использовать order by:

select sd.*
from sensor_data sd
order by (value ->> 'value')::float desc
limit 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...