我有一个表t,它有以下数据:
name | n ------------+--- school | 4 hotel | 2 restaurant | 6 school | 3 school | 5 hotel | 1
当我运行以下查询时,结果有点奇怪.
select name,n,first_value(n) over (partition by name order by n desc),last_value(n) over (partition by name order by n) from t; name | n | first_value | last_value ------------+---+-------------+------------ hotel | 1 | 2 | 1 hotel | 2 | 2 | 2 restaurant | 6 | 6 | 6 school | 3 | 5 | 3 school | 4 | 5 | 4 school | 5 | 5 | 5 (6 rows)
虽然first_value按预期工作,但last_value很奇怪.我认为last_value列的值应该与first_value相同,因为first_value是按n递减的顺序.
Postgresql的版本是:
postgres=# select version(); version ----------------------------------------------------------------------------------------------------------------------------------- Postgresql 9.4.1 on x86_64-apple-darwin14.1.0,compiled by Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn),64-bit (1 row)
不,这不是一个错误. first_value()和last_value()函数适用于窗口框架,而不是分区.如果没有指定frame_clause,则窗口框架(根据
documentation)默认为分区的开始到当前行.这正是first_value()所需要的,但是对于last_value(),你应该在WINDOW定义之外的无界前置和无界后续之间添加范围,以超越当前行:
select name,last_value(n) over (partition by name order by n range between unbounded preceding and unbounded following) from t;
另请注意,这与分区中行的排序无关.排序以特定顺序(不出意料地)生成分区,然后基于帧的函数在窗口框架上工作,而不知道或关心行的任何排序.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。