Последняя строка в группе на основе столбца меток времени для подмножества идентификаторов групп - Postgres - PullRequest
0 голосов
/ 15 апреля 2020

Учитывая таблицу postgres следующей формы:

group id | timestamp                     | value
---------+-------------------------------+------
       1 | 2020-04-15 15:04:44.020288+00 | 8.0
       2 | 2020-04-15 15:05:44.020288+00 | 9.0
       3 | 2020-04-15 15:06:44.020288+00 | 10.0
       4 | 2020-04-15 15:07:44.020288+00 | 11.0
       1 | 2020-04-15 15:08:44.020288+00 | 12.0
       2 | 2020-04-15 15:09:44.020288+00 | 13.0
       3 | 2020-04-15 15:10:44.020288+00 | 14.0
       4 | 2020-04-15 15:11:44.020288+00 | 15.0

Что такое запрос SQL для получения последней строки для подмножества идентификаторов групп на основе столбца метки времени?

Например, извлекая последнюю строку для идентификаторов группы {1,3}, получая:

group id | timestamp                     | value
---------+-------------------------------+------
       1 | 2020-04-15 15:08:44.020288+00 | 12.0
       3 | 2020-04-15 15:10:44.020288+00 | 14.0 

Заранее благодарим вас за внимание и ответ

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Простой и эффективный метод решения этой проблемы с наибольшим числом групп в Postgres заключается в использовании distinct on:

select distinct on (group_id) t.*
from mytable t
where group_id in (1, 3)
order by group_id, timestamp desc
0 голосов
/ 15 апреля 2020

Вы должны быть в состоянии сделать это через partition и row_number():

with cte1 as (
  select
    *,
    row_number() over (partition by group_id order by timestamp desc) as row_number
  from yourtable t
)

select *
from cte1
where row_number = 1
...