根据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。
答案 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 )。因此,我将使用此空间记录遇到的陷阱。
OVER()
返回NULL。我对如何解决这个问题有一些想法,但是它们会使查询非常难看并且效率很低。