найти максимальное значение одного поля, связанного с другим постоянным полем в postgresql - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть три поля в запросе postsql, как показано ниже:

point     |      time a         |      time b
----------+---------------------+--------------------
     1    |2018-09-27 00:00:00 | 2018-09-26 00:00:00  
     1.5  |2018-09-27 00:00:00 | 2018-09-25 00:00:00  
     1.75 |2018-09-27 00:00:00 | 2018-09-24 00:00:00  
     1.25 |2018-09-27 00:00:00 | 2018-09-23 00:00:00
     2    |2018-09-28 00:00:00 | 2018-09-26 00:00:00  
     2.5  |2018-09-28 00:00:00 | 2018-09-25 00:00:00  
     2.7  |2018-09-28 00:00:00 | 2018-09-24 00:00:00  
     2.1  |2018-09-28 00:00:00 | 2018-09-23 00:00:00 

Теперь время a имеет 4 постоянных значения с различными полями времени b, связанными с ним, как показано выше.

Как мне сделать запрос, чтобы найти поле максимального времени b для каждого значения времени?

Я знаю, что в предыдущих предложениях упоминалось, что я должен делать такие вещи, как:

row_number () OVER (разделить по времени на порядок по времени b).Однако у меня возникают большие проблемы с применением этого, когда есть дополнительное поле.

Желаемый результат запроса postgresql будет:

point  |  time a             |      time b
-------+---------------------+--------------------
 1     |2018-09-27 00:00:00 | 2018-09-26 00:00:00  
 2     |2018-09-28 00:00:00 | 2018-09-26 00:00:00  

Как настроить вышеуказанный запрос дляполучить желаемый результат выше?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

demo: db <> fiddle

Вы можете GROUP BY trunc(point), который сначала усекает десятичную часть point, а затем группирует целую часть.

SELECT trunc(point), max(time_a), max(time_b) 
FROM times
GROUP BY trunc(point)

Если вы уверены, что time_a является постоянной величиной для point, как в вашем примере, это может быть записано как:

SELECT trunc(point), time_a, max(time_b) 
FROM times
GROUP BY trunc(point), time_a

В противном случае вы можете взять point независимую версию вместо time_aколонка:

SELECT trunc(MIN(point)), time_a, max(time_b) 
FROM times
GROUP BY time_a
0 голосов
/ 27 сентября 2018

Вы можете использовать функции Windows для этого.Примерно так:

select time_a, time_b
from (select time_a, time_b, row_number() 
  over (partition by time_a order by time_b DESC) from times)t
where row_number = 1

Для каждой группы time_a вы получаете номер строки для каждого значения time_b.Так как они заказаны, номер один будет макс.Наконец, для фильтрации вам необходим внешний выбор.

Этот подход более гибкий, чем просто группировка, если у вас есть любое другое поле в таблице, которое вы хотите отобразить.

...