Запрос самой последней записи для каждой группы

У меня есть имя таблицы price:

CREATE TABLE price (
  price_id bigint pk,
  product_id bigint,
  start_date timestamp with timezone
)

с запросом:

select price_id, product_id, price, start_date 
from price 
where start_date <= current_timestamp

Я получаю это, отсортированное по пользовательскому интерфейсу:

price_id | product_id  | start_date
5 1 2018-12-31  17:00:00.000000
60  1   2019-07-18 17:00:00.000000
66  1   2019-07-19 17:00:00.000000
6   2   2018-12-31 17:00:00.000000
69  2   2019-07-19 17:00:00.000000
7   3   2018-12-31 17:00:00.000000
8   4   2018-12-31 17:00:00.000000
9   5   2018-12-31 17:00:00.000000
10  6   2018-12-31 17:00:00.000000
11  7   2018-12-31 17:00:00.000000
59  7   2019-07-18 17:00:00.000000
67  8   2019-07-19 17:00:00.000000
71  8   2019-07-22 17:00:00.000000
12  8   2018-12-31 17:00:00.000000
64  8   2019-07-17 17:00:00.000000
13  9   2018-12-31 17:00:00.000000
14  10  2018-12-31 17:00:00.000000
15  11  2018-12-31 17:00:00.000000
16  12  2018-12-31 17:00:00.000000
70  12  2019-07-21 17:00:00.000000
17  13  2018-12-31 17:00:00.000000
18  14  2018-12-31 17:00:00.000000
19  15  2018-12-31 17:00:00.000000
46  16  2019-07-05 17:00:00.000000
54  16  2019-07-17 17:00:00.000000
20  16  2019-06-01 07:46:25.737000
44  16  2019-07-04 17:00:00.000000
53  16  2019-07-15 17:00:00.000000
55  16  2019-07-18 17:00:00.000000
21  17  2018-12-31 17:00:00.000000
22  18  2018-12-31 17:00:00.000000
23  19  2018-12-31 17:00:00.000000
24  20  2018-12-31 17:00:00.000000
25  21  2018-12-31 17:00:00.000000
74  21  2019-07-22 17:00:00.000000
26  22  2018-12-31 17:00:00.000000
27  23  2018-12-31 17:00:00.000000
68  23  2019-07-20 17:00:00.000000
28  24  2018-12-31 17:00:00.000000
29  25  2018-12-31 17:00:00.000000
30  26  2018-12-31 17:00:00.000000
31  27  2018-12-31 17:00:00.000000
32  28  2018-12-31 17:00:00.000000
33  29  2018-12-31 17:00:00.000000
34  30  2018-12-31 17:00:00.000000
35  31  2018-12-31 17:00:00.000000
36  32  2018-12-31 17:00:00.000000
37  33  2018-12-31 17:00:00.000000
63  34  2019-07-17 17:00:00.000000
38  34  2018-12-31 17:00:00.000000
62  34  2019-07-14 17:00:00.000000
39  35  2018-12-31 17:00:00.000000
43  35  2019-06-01 07:46:25.737000
61  35  2019-07-21 17:00:00.000000

Как видите, существует несколько product_id, и для каждого product_id есть несколько start_date.

Мне нужен нативный запрос postgre, который может получить только 1 start_date, ближайший current_timestamp для каждого product_id.

переведены в HQL после, если это возможно. Если нет, то подойдет только запрос postgre.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
84
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

демо: БД <> рабочий пример

Предложение DISTINCT ON дает вам первую запись упорядоченной группы. Группы в вашем случае — это productId, которые упорядочены start_date в порядке убывания, что приводит к тому, что самая последняя из них оказывается наверху каждой группы. Это взято DISTINCT ON:

SELECT DISTINCT ON (product_id)
    *
FROM
    price
ORDER BY product_id, start_date DESC

Привет, спасибо за ответ. Мне все еще нужно, чтобы start_date был ближе всего к current_timestamp или текущей дате. Если я сделаю отдельный для product_id, он получит только самый последний, а не тот, который ближе всего к заданной дате (current_timestamp)

RukaDo 23.07.2019 11:32

Я только что перепроверил свой запрос. Я пропустил заказ по частям, поэтому мой результат не совпал с вашим. Ваш ответ сработал отлично. Спасибо

RukaDo 23.07.2019 11:39

Другие вопросы по теме