postgresql - 没有 ORDER BY 的窗口函数

标签 postgresql

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 的升序排列。我可以依靠它吗?

最佳答案

好问题!

不,你不能依赖它。

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

关于postgresql - 没有 ORDER BY 的窗口函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52401207/

相关文章:

sql - 如何确定一个时间戳在 postgresql 中是否在另一个时间戳之前?

sql - 如何用随机值更新列中的所有行?

php - 检查有效的 SQL 列名

ruby-on-rails - 在 Heroku、PostgreSQL 和 Rails 5 上运行迁移时出错

mysql - sql子串性能

postgresql - 使用 HLL 在 Tableau 上执行提取以获取非重复计数

postgresql - 无法通过 -v 共享 docker 容器数据

java - postgresql 的 Hibernate 5 命名策略

postgresql - Ubuntu 20.04 上的 PgAdmin fatal error : password authentication failed for user

macos - PostreSQL93 + postgis2 使用 MacPorts