没有 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