首页 > 解决方案 > 没有 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);

标签: postgresql

解决方案


用于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并确保安全。


推荐阅读