我正在学习postgres windows函数,我在转换这个SQL查询时遇到了一些麻烦。
现在,我的查询返回窗口函数结果的第一行,我想让它返回最后一行。我不能像使用“第一个结果”那样使用简单的整数,因为每个结果都有不同的行数。
以下是查询:
select * from (select *, row_number() over (partition by user_id) as row_number from photos) as rows where row_number = 1 and deleted = false
我希望能够指定row_number = last_row()
或类似的东西。这可能吗?
答案 0 :(得分:2)
如果您的每个用户都有一张包含多张照片的表格,而您只想要最新的照片,那么这样的话就可以了。我假设某个类型的日期列告诉您拍摄照片的时间,并且为了争论,我将其命名为photo_date
。
with all_data as (
select
*, max (photo_date) over (partition by user_id) as max_date
from photos
where deleted = false
)
select *
from all_data
where
photo_date = max_date
这使用max
分析函数,对于大型数据集,它可能比row_number
更好地工作,因为它应该是最坏的情况O(n)。
另一方面,如果你有两张完全相同照片日期的记录,这也恰好是最新的,那么可以想象这种逻辑会适得其反,因为它会带回两条记录。哪一个最好归结为了解您的数据,但是值得考虑的是这个替代方案。
答案 1 :(得分:0)
这样你就可以获得最后一行。 {@ 1}}按照@a_horse_with_no_name在评论中的建议添加。
Order by