⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 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 子句的窗口函数
  • 公共表表达式和表子查询,只要它们仅包含上述组件

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

以下操作**不**保证保留行顺序

  • 具有多个表和/或子查询的 FROM
  • JOIN
  • UNION
  • USING SAMPLE
  • GROUP BY(特别是,输出顺序是不确定的,并且除非在聚合函数中明确指定,否则行输入到顺序敏感聚合函数的顺序也是不确定的)
  • ORDER BY(特别是,ORDER BY 可能不使用稳定算法
  • 标量子查询

插入顺序

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

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

SET preserve_insertion_order = false;