全部文档
文档中心数据流3.0语法建议SQL使用建议

SQL使用建议

数据流中的【SQL转换】节点、【数据转换】节点的【列计算】步骤、【连接器查询】和【数据表查询】节点的SQL模式等,都会涉及到SQL语言的编写,因此有必要对SQL语言有一些基础认识。

不同数据库中的SQL语法各有不同,此文档仅以DuckDB数据库为例。

【连接器查询】和【数据表查询】节点的SQL语法需要符合该节点选择的数据库类型,其他未指定明确数据库的节点,都使用DuckDB数据库的SQL进行数据库处理(例如【SQL转换】节点、【数据转换】节点的【列计算】步骤)。

如何在SQL框中引用数据流中的预置变量,详见预置变量章节:https://docs.deepfos.com/component/deeppipeline/function/variable#sql

添加【SQL转换】节点,运行SELECT version()可得到版本信息。

若您的环境部署了AI助手,在SQL框可直接使用AI助手来编写/分析/检查/重写SQL:

若未部署,也可使用其他 AI 工具辅助查询。建议在提示词中指明数据库类型、版本、输入字段和预期结果,并在测试数据上验证语法、结果和性能后再用于生产。AI 输出只能作为编写辅助,不能替代实际环境验证。

进入 SQL 代码框的全屏状态后,可在左侧查看系统内置的常用函数解释和示例。需要按专题查阅更多函数时,可继续阅读SQL 函数与语法参考

以下表格提供部分常用函数示例。函数支持范围可能随数据流内置 DuckDB 版本变化,应以当前环境执行结果和对应版本的 DuckDB 官方文档为准。

因文档格式问题,用图片代替表格。

示例

帮助说明

绝对值(abs)

返回绝对值,用函数别名@也有同样效果。
示例1:abs(-17.4)
结果1:17.4
示例2:@(-17.4)
结果2:17.4

四舍五入(round)

四舍五入保留s位小数。允许s为负数。
示例:round(42.4332, 2)
结果:42.43

行号(row_number)

为每行生成一个行号,支持分区和区内排序。
示例1(不分区的连续行号):row_number() OVER ()
示例2(按门店分区,区内按金额降序,连续行号):row_number() OVER (PARTITION BY Store ORDER BY Amount Desc)

示例

帮助说明

提取(extract)

提取日期字段中的年月日等组成部分,提取出的字段类型为整数。
常用的指定符号:年year,月month,日day,时hour,分minute,秒second,世纪century,季度quarter。
示例1:extract(‘year’ FROM DATE ‘1992-01-20’)
结果1:1992
示例2:extract(‘quarterr’ FROM DATE ‘1992-01-20’)
结果2:1

格式化(strftime)

将日期字段转换为指定格式的文本。常用的格式指定符号如下(注意大小写)。
年:%Y;
月:%m;
日:%d,固定两位数,左补0,例如01;
日:%-d,不固定位数,例如1;
时:%H,24小时制,固定两位数,左补0;
时:%I,12小时制,固定两位数,左补0;
分:%M,固定两位数,左补0;
秒:%S,固定两位数,左补0;

示例1:strftime(now(), ‘%Y-%m-%d %H:%M:%S’)
结果1:2026-02-11 18:44:17
示例2:strftime(today, ‘%a, %-d %B %Y’)
结果2:Wed, 11 February 2026

今天(today)

当前日期(本地时区),不带时分秒(时分秒都是0)。
示例1:today()
结果1:2022-10-08

月末(last_day)

返回指定日期所在月份的最后一天,结合天数计算,还可以轻松得出月初的日期。
示例1:last_day(today())
结果1:2026-02-28

天数计算(+/-)

用加减法进行日期间的天数计算。
示例1(5天后):today() + 5
结果1:2026-02-16
示例2(5天后):today() + INTERVAL 5 DAY
结果2:2026-02-16
示例3(5天前):today() - 5
结果3:2026-02-06
示例4(2个日期间隔了几天):DATE ‘1992-03-27’ - DATE ‘1992-03-22’
结果4:5

示例

帮助说明

现在(now)

当前时间,数据流中会转化为0时区进行显示。以下函数效果相同:current_timestamp, get_current_timestamp(), transaction_timestamp()。
示例1:now()
结果1:2026-02-11T11:22:02+00
示例2:current_timestamp
结果2:2026-02-11T11:22:02+00
示例3:get_current_timestamp()
结果3:2026-02-11T11:22:02+00

时间戳转换(to_timestamp)

将自1970-01-01以来的秒数转换为0时区的时间,若是毫秒数,需要先除以1000,或使用epoch_ms函数,该函数可用于毫秒和本地时间的互相转换。
示例1:to_timestamp(1284352323.5)
结果1:2010-09-13T04:32:03+00
示例2:epoch_ms(1767198163000)
结果2:2025-12-31T16:22:43
示例3:epoch_ms(now())
结果3:1767198163000

指定时区(AT TIME ZONE)

返回指定时区的时间戳。
时区的格式可以通过在【SQL转换】节点中执行这段语句进行查询,返回的name列为时区格式:SELECT * FROM pg_timezone_names();
示例1:now() AT TIME ZONE ‘Asia/Shanghai’
结果1:2026-02-11T19:42:53.710000
示例2:timezone(‘Asia/Shanghai’, now())
结果2:2026-02-11T19:42:53.710000

示例

帮助说明

空值替换(coalesce)

coalesce函数可接受任意数量的参数,并返回第一个非空的参数。若所有参数均为空值,coalesce同样返回空值。
示例1:coalesce(NULL, NULL, 1)
结果1:1
示例2:coalesce(10, 20)
结果2:10
示例3:coalesce(NULL, NULL)
结果3:NULL

空值替换(ifnull)

双参数版本的coalesce函数,返回第一个非空的参数。
示例1:ifnull(NULL, ‘default_string’)
结果1:default_string
示例2:ifnull(1, ‘default_string’)
结果2:1

判断为空(IS NULL)

判断是否为空,返回布尔值。
示例1(判断为空):NULL IS NULL
结果1:true
示例2(判断不为空):NULL IS NOT NULL
结果2:false

示例

帮助说明

长度(length)

返回列表的成员数量,NULL成员也会被统计数量,用函数len和array_length效果一样
示例1:length([1,2,3])
结果1:3
示例2:len([NULL,1,2,3,NULL])
结果2:5
示例3:array_length([NULL,1,2,3,NULL])
结果3:5

去重去空(list_distinct)

去除列表中的所有重复值和NULL值,去重后无法保留原顺序。
示例:list_distinct([1, 1, NULL, -3, 1, 5])
结果:[5, -3, 1]

去重去空计数(list_approx_count_distinct)

列表成员去重、去NULL后,统计数量。函数list_unique也有同样效果,但其不适用于大数据场景,结果更精准但极大影响效率。
示例:list_approx_count_distinct([NULL,1,2,3,3,NULL])
结果:3

转文本(list_string_agg)

将列表元素拼接为字符串,不去重,保留顺序。
示例:list_string_agg([3,3,9])
结果:3,3,9

成员排序(list_sort)

对列表中的元素进行排序。list_sort最多可接受两个额外的可选参数:第二个参数指定排序顺序,可选ASC(升序)或DESC(降序);第三个参数指定空值位置,可选NULLS FIRST(空值在前)或NULLS LAST(空值在后)。
示例1:list_sort([1, 3, NULL, 5, NULL, -5])
结果1:[NULL, NULL, -5, 1, 3, 5]
示例2:list_sort([1, 3, NULL, 2], ‘ASC’)
结果2:[NULL, 1, 2, 3]
示例3:list_sort([1, 3, NULL, 2], ‘DESC’, ‘NULLS FIRST’)
结果3:[NULL, 3, 2, 1]
示例4:list_reverse_sort([1, 3, NULL, 2], ‘NULLS LAST’)
结果4:[3, 2, 1, NULL]
示例5:list_reverse_sort([1, 3, NULL, 2], ‘NULLS LAST’)
结果5:[NULL, 3, 2, 1]

展平(flatten)

展平一层,不会递归展平所有层级,也不会去重去NULL。
示例1:flatten([ [1, 2], [3, 4] ])
结果1:[1, 2, 3, 4]
示例2:flatten([ [ [1, 2], [3, 4] ], [ [5, 6], [7, 8] ] ])
结果2:[ [1, 2], [3, 4], [5, 6], [7, 8] ]

解包(unnest)

将列表按一层层级展开为多行,这是一个会改变结果集行数的特殊函数。可通过max_depth参数限制递归展开的深度。解包空列表和NULL均会导致零行,如果您要解包的列可能为空列表或NULL,通常需要先进行处理,否则会导致返回的行数减少。
示例1:unnest([1, 2, 3])
结果1:3行:1, 2, 3
示例2:unnest([[[1, 2], [3, 4]], [[5, 6], [7, 8, 9], []], [[10, 11]]], max_depth := 2)
结果2:6行:[1,2] , [3,4] , [5,6] , [7,8,9], [], [10,11]
示例3:unnest([])
结果3:0行
示例4:unnest(NULL)
结果4:0行

筛选(filter)

从输入列表中筛选出使lambda函数返回true的元素构造为新列表。DuckDB必须能够将lambda函数的返回类型转换为BOOL类型。函数返回的类型与输入列表的类型相同。
示例1:filter([3, 4, 5], x -> x > 4)
结果1:[5]
示例2:filter([1, NULL, 3], x -> x IS NOT NULL)
结果2:[1, 3]

区间(range)

生成从start到stop范围内的值构成的列表。start参数包含在内,默认为0,stop参数不包含在内,允许指定增长的步长,默认为1。
示例1:range(5)
结果1:[0, 1, 2, 3, 4]
示例2:range(2, 5)
结果2:[2, 3, 4]
示例3:range(2, 8, 3)
结果3:[2,5]

示例

帮助说明

类型转换(CAST)

标准语法为:CAST(表达式 AS 类型名),还支持简写形式:表达式::类型名。
常用的类型名:文本VARCHAR,指定精度小数DECIMAL(总长度, 小数位数) ,整数INTEGER,布尔值BOOLEAN,日期DATE。
示例1:CAST(column AS VARCHAR)
示例2:column::DOUBLE

条件判断(CASE)

CASE表达式会执行满足的条件后对应的表达式,当仅有一个条件时,也可使用IF(cond, a, b)来表示当满足cond则输出a否则输出b。
示例1:CASE WHEN i > 2 THEN 1 ELSE 0 END
示例2:IF(i > 2, 1, 0)
示例3:CASE WHEN i = 1 THEN 10 WHEN i = 2 THEN 20 ELSE 0 END

根据版本信息,可访问DuckDB官网获得对应版本的语法帮助,以1.2版本为例,官网地址:https://duckdb.org/docs/1.2/sql/functions/overview

访问其中的具体章节,为您的具体问题提供更多建议。

例如想查找更多的日期格式指定符号:

回到顶部

咨询热线

400-821-9199