加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

分区窗口函数中的PostgreSQL错误?

发布时间:2020-12-13 18:07:28 所属栏目:百科 来源:网络整理
导读:我有一个表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) ov
我有一个表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的错误还是我错过了什么?

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;

另请注意,这与分区中行的排序无关.排序以特定顺序(不出意料地)生成分区,然后基于帧的函数在窗口框架上工作,而不知道或关心行的任何排序.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读