Получить последнюю запись по дате

Я хочу получить информацию о пользователях и количестве баллов, которые они набрали до определенной даты. Проблема: я не могу знать, когда их состояние было записано в последний раз, поэтому мне нужно получить последнюю запись до указанной даты.

Запрос, который я получил, выглядит примерно так (упрощенный пример):

SELECT u.id, p.points, p.timestamp
FROM user AS u 
  INNER JOIN points 
    ON u.id = p.user_id
WHERE u.group = 'red'
AND p.timestamp::date <= '2018-01-01 10:00:00'
GROUP BY u.id, u.first_name, u.last_name, mh.gamified_mastery, mh.updated_at
ORDER BY mh.updated_at DESC

Это дает мне такую ​​таблицу:

id | points | timestamp
-----------------------
 1 | 10     | 2018-01-01 9:00:00
 1 | 25     | 2018-01-01 8:57:00
 1 | 25     | 2018-01-01 8:00:00
 2 | 100    | 2018-01-01 7:00:00
 2 | 50     | 2018-01-01 6:00:00
 2 | 15     | 2018-01-01 5:55:00

На самом деле я не хочу, чтобы отображалась метка времени, она здесь для презентации. Мне нужны только самые популярные записи для каждого игрока, но мне нужно сгруппировать по отметкам времени, чтобы ORDER BY работал.

Из-за других ограничений мне действительно нужно сделать все это в одном запросе (я знаю, что могу просто сделать отдельный запрос с LIMIT 1 и присоединиться к ним в приложении, но в настоящее время это не вариант).

Вы можете выполнить левое внешнее боковое соединение и расположить ORDER BY и LIMIT 1 с правой стороны.

Laurenz Albe 13.04.2018 11:28

Каких результатов вы действительно хотите?

Gordon Linoff 13.04.2018 13:14
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Думаю, вам нужен distinct on:

SELECT DISTINCT ON (u.id) u.id, . . .
FROM (SELECT u.id, p.points, p.timestamp
      FROM user u INNER JOIN
           points p
           ON u.id = p.user_id
      WHERE u.group = 'red' AND
            p.timestamp::date <= '2018-01-01 10:00:00'
      GROUP BY u.id, u.first_name, u.last_name, mh.gamified_mastery, mh.updated_at
    ) pu
ORDER BY u.id, mh.updated_at DESC;

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