我希望获得有关用户的信息以及他们在特定日期之前获得的积分数量。这个问题我不知道他们的状态是最后一次记录的,所以我必须在日期之前得到最新的条目。
我最终得到的查询是这样的(简化示例):
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进行单独查询并在应用程序中加入它们但当前不是一个选项。)
答案 0 :(得分:0)
我想你想要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;