⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
顺序保留

对于许多操作,DuckDB 会保留行的顺序,这与 Pandas 等数据框库类似。

示例

以如下表为例

CREATE TABLE tbl AS
    SELECT *
    FROM (VALUES (1, 'a'), (2, 'b'), (3, 'c')) t(x, y);

SELECT *
FROM tbl;
x y
1 a
2 b
3 c

让我们来看以下查询,它返回 x 为奇数的行

SELECT *
FROM tbl
WHERE x % 2 == 1;
x y
1 a
3 c

由于行 (1, 'a') 在原始表中出现在 (3, 'c') 之前,因此可以保证它在该表中也排在这一行之前。

子句

以下子句保证保留原始行顺序

  • COPY(参见 插入顺序
  • 带有单个表的 FROM
  • LIMIT
  • OFFSET
  • SELECT
  • UNION ALL
  • WHERE
  • 带有空 OVER 子句的窗口函数
  • 只要仅包含上述组件的公用表表达式(CTE)和表子查询

提示:row_number() OVER () 允许将原始行顺序转换为一个显式列,从而可以在默认不保留行顺序的操作中进行引用。在物化表上,可以使用 rowid 伪列达到相同的效果。

以下操作保证保留行顺序

  • 带有多个表和/或子查询的 FROM
  • JOIN
  • UNION
  • USING SAMPLE
  • 全表聚合(除非在聚合函数中明确指定,否则不保证输入顺序,即馈送到 顺序敏感聚合函数 的行顺序)
  • GROUP BY(不保证输入或输出顺序)
  • ORDER BY(具体而言,ORDER BY 可能不会使用 稳定算法
  • 标量子查询

插入顺序

默认情况下,以下组件会保留插入顺序

插入顺序的保留由 preserve_insertion_order 配置选项 控制。此设置默认为 true,表示应保留顺序。要更改此设置,请使用

SET preserve_insertion_order = false;
© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南