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

RGr*_*run 4 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()或类似的东西。那可能吗?

Ham*_*one 5

如果在这种情况下,您有一张包含每个用户的多张照片的表格,而您只想要最近的一张,那么类似这样的方法就可以了。我假设有一个某种类型的日期列告诉你照片是什么时候拍摄的,为了论证起见,我将它命名为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
Run Code Online (Sandbox Code Playgroud)

这使用了max分析函数,对于大型数据集可能比row_number因为它应该是最坏的情况 O(n)更好地工作。

另一方面,如果您有两个具有完全相同照片日期的记录,并且恰好是最近的记录,那么可以想象这种逻辑会适得其反,因为它会带回两个记录。哪个最好实际上归结为了解您的数据,但对于值得考虑的替代方案。