没有 ORDER BY 的窗口函数

Posted

技术标签:

【中文标题】没有 ORDER BY 的窗口函数【英文标题】:Window function without ORDER BY 【发布时间】:2019-02-23 08:29:24 【问题描述】:

OVER () 子句中有一个没有ORDER BY 的窗口函数。是否保证将按照 SELECT 本身中的 ORDER BY 表达式指定的顺序处理行?

例如:

SELECT tt.*
     , row_number() OVER (PARTITION BY tt."group") AS npp --without ORDER BY
FROM
  (
   SELECT SUBSTRING(random() :: text, 3, 1) AS "group"
        , random() :: text          AS "data"
   FROM generate_series(1, 100) t(ser)
   ORDER BY "group", "data"
  ) tt
ORDER BY tt."group", npp;

在此示例中,子查询返回在每个组中按升序排序的data。窗口函数以相同的顺序处理行,因此行号按data 的升序排列。我可以依靠这个吗?

【问题讨论】:

简短的回答是“不”。 【参考方案1】:

如果您在over () 中使用order by

row_number() OVER (PARTITION BY tt."group" ORDER BY tt."group")

你应该得到你想要的订单。

【讨论】:

【参考方案2】:

好问题!

不,你不能依赖它。

窗口函数在查询的ORDER BY 子句之前处理,并且在窗口定义中没有ORDER BY,行将按照它们恰好来自子选择的顺序进行处理.

【讨论】:

以上是关于没有 ORDER BY 的窗口函数的主要内容,如果未能解决你的问题,请参考以下文章

使用具有不同 order by 子句的 postgres 窗口函数

使用具有“order by”组件的窗口函数时,结果集的顺序是啥?

SQL 窗口函数 - SELECT DISTINCT ORDER BY LIMIT

窗口函数 ROW_NUMBER() 使用变量 RUNNING TOTAL 更改处理 ORDER BY

窗口函数只能出现在 SELECT 或 ORDER BY 子句中--update in cursor

Sql server - 窗口函数只能出现在 SELECT 或 ORDER BY 子句中