使用postgres row_number()窗口函数获取最后一行

时间:2015-12-08 23:06:58

标签: postgresql

我正在学习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()或类似的东西。这可能吗?

2 个答案:

答案 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