postgresql - 没有 ORDER BY 的窗口函数中保留的顺序
问题描述
在选择中重复使用时,unordered_window 是否保证以相同的顺序提供元素?我希望避免订购成本,因为只要订单相同,订单就无关紧要。
即,xs[i] 和 ys[i] 是否总是来自 xyz 中同一行的元素?
select
array_agg(x) over unordered_window as xs,
array_agg(y) over unordered_window as ys
from
xyz
window
unordered_window as (partition by z);
解决方案
用于EXPLAIN (VERBOSE, COSTS OFF)
查看会发生什么:
QUERY PLAN
═══════════════════════════════════════════════════════════
WindowAgg
Output: array_agg(x) OVER (?), array_agg(y) OVER (?), z
-> Sort
Output: z, x, y
Sort Key: xyz.z
-> Seq Scan on laurenz.xyz
Output: z, x, y
只有一个排序,所以我们可以推断顺序是相同的。
但这并不能保证,因为实施可能(尽管不太可能)发生变化。
但是您会看到无论如何都会执行排序。您也可以添加ORDER BY
; 所做的只是另一个排序键,它不会减慢执行速度。因此,您不妨添加ORDER BY
并确保安全。
推荐阅读
- python-3.x - RandomForestRegressor 仅吐出 1 个预测
- java - Oracle Java 教程 [基本类 > 基本 I/O > 文件操作] 和 java.nio.file.Files 类 javadocs 差异
- r - R根据名称比较特定列
- r - 如何绘制历史数据和未来预测,以及预测的错误阴影
- android - 可在 Sceneform 和 ARCore 中渲染的 ShapeFactory 的不可见/透明材质
- python - 使用 Python randomQuizGenerator 错误自动化无聊的事情
- tensorflow - Exactly match 2 rows in a tensor Tensorflow
- r - 将 setdiff 结果存储在数据框单元格中
- java - 为什么我的对象没有被添加到我的数组中?
- c++ - 同时运行两个函数。(即时的)