PostgreSQL:first_value(unique_column)OVER()有什么问题?

时间:2018-09-07 14:35:49

标签: postgresql window-functions

根据PostgreSQL: detecting the first/last rows of result set,我们有理由怀疑这样的条款是危险的或不适当的,并希望更好地理解。拿

SELECT last_value(unique_column) OVER (), * FROM mytable;

unique_column是唯一的,不能为null。那么以这种方式使用OVER ()有什么问题呢?危险/不可靠吗?次优?据我所知,这应该返回结果集中最后一行的值-至少在我尝试过时才具有它。有人告诉我,“ last”如果不进行排序就没有意义,但是很显然有返回的最后一行。我还被告知OVER ()的意思是“一切都行”,这表明结果不可靠,但是到目前为止,每次我运行这种查询时,我都会得到一致的值结果集的结尾。

现在,我已经发现了一个问题,如果我使用ORDER BY

SELECT last_value(unique_column) OVER (), * FROM mytable ORDER BY something_else;

但是,我的解决方案是子查询:

SELECT last_value(unique_column) OVER (), * FROM (SELECT * FROM mytable ORDER BY something_else) sub;

好像OVER ()意味着分析函数(如first_value()last_value())是根据引擎读取表/子查询的顺序进行操作的。而且,据我所知,您对引擎读取表/子查询的顺序有足够的控制权(而不必进行不必要的排序)。

我正在Debian 9.5环境中运行PostgreSQL 9.6。

2 个答案:

答案 0 :(得分:0)

您应在ORDER BY子句中提供OVER

SELECT *,
 last_value(unique_column) 
 OVER (ORDER BY sth_else ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
FROM mytable

答案 1 :(得分:0)

我应该指出,在过去的几个月中,该解决方案已经取得了不错的成绩,并且没有显示替代方案,因此我将继续使用它。但是,我应该指出,它是挑剔的,如果您进行某些更改并且不考虑分析,则可能会失败。 (毫无疑问,我滥用了该功能,并且为此目的开发了 not )。因此,我将使用此空间记录遇到的陷阱。

  1. 如果您订购结果,就会遇到问题,但是我已经在问题中对此进行了解释。
  2. 我试图在外部联接中使用它。由于这导致结果集中的字段为空(即使它们取自不能为空的表中的字段),这导致OVER()返回NULL。我对如何解决这个问题有一些想法,但是它们会使查询非常难看并且效率很低。