我有一个包含许多重复项目的表格 - 许多行具有相同的id
,可能唯一的区别是requested_at
列。
我想从表中执行select *
,但只返回一行id
- 最近请求的行。
我调查了group by id
,但后来我需要为每一列做一个聚合。 requested_at
- max(requested_at) as requested_at
很容易实现这一点 - 但其他方面很难。
如何确保获得与最近更新的行对应的title
等的值?
答案 0 :(得分:9)
我建议使用类似的形式来避免窗口函数中的排序:
iex> presence = %Presence{ user_id: 1, event_id: 1 } |> Repo.insert!
答案 1 :(得分:2)
尝试这样的事情:
SELECT *
FROM (
SELECT
*,
ROW_NUMBER()
OVER (
PARTITION BY <id_column>
ORDER BY <timestamp column> DESC)
row_number,
FROM <table>
)
WHERE row_number = 1
请注意,它会添加您可能不需要的row_number
列。要解决此问题,您可以在外部select语句中按名称选择单个列。
在您的情况下,听起来requested_at
列是您要在ORDER BY
中使用的列。
并且,您还需要使用allow_large_results,设置目标表,并指定不对结果进行展平(如果您的模式包含重复字段)。