我正在学习 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()或类似的东西。那可能吗?
如果在这种情况下,您有一张包含每个用户的多张照片的表格,而您只想要最近的一张,那么类似这样的方法就可以了。我假设有一个某种类型的日期列告诉你照片是什么时候拍摄的,为了论证起见,我将它命名为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)更好地工作。
另一方面,如果您有两个具有完全相同照片日期的记录,并且恰好是最近的记录,那么可以想象这种逻辑会适得其反,因为它会带回两个记录。哪个最好实际上归结为了解您的数据,但对于值得考虑的替代方案。