概述
算术函数适用于任意两个类型为UInt8、UInt16、UInt32、UInt64、Int8、Int16、Int32、Int64、Float32 或 Float64 的操作数。
在执行运算之前,两个操作数都会转换为结果类型。结果类型按如下方式确定 (除非下文的函数文档中
另有说明) :
- 如果两个操作数都不超过 32 位宽,则结果类型的大小将取两者中较大操作数所对应类型之后的下一个更大类型
(整数类型提升) 。例如,
UInt8 + UInt16 = UInt32或Float32 * Float32 = Float64。 - 如果其中一个操作数为 64 位或更宽,则结果类型的大小与两个操作数中较大的那个相同。例
如,
UInt32 + UInt128 = UInt128或Float32 * Float64 = Float64。 - 如果其中一个操作数是有符号类型,则结果类型也将是有符号类型;否则为无符号类型。例如,
UInt32 * Int32 = Int64或UInt32 * UInt32 = UInt64。
abs
引入版本:v1.1.0 计算x 的绝对值。如果 x 是无符号类型,则不会产生任何影响。如果 x 是有符号类型,则返回无符号数。
语法
x— 需要求绝对值的值
x 的绝对值
示例
使用示例
Query
Response
avg2
引入版本:v25.11.0 计算并返回所提供参数的平均值。 支持数值类型和时间类型。 语法x1, x2]— 接受两个用于计算平均值的参数。
Query
Response
Query
Response
Query
Response
Query
Response
Query
Response
byteSwap
引入版本:v23.10.0 将整数的字节顺序反转,即改变其字节序。 下面的示例可按以下方式理解:- 将十进制整数转换为对应的大端十六进制格式,即 3351772109 -> C7 C7 FB CD (4 字节)
- 将字节顺序反转,即 C7 C7 FB CD -> CD FB C7 C7
- 假定结果为大端格式,将其转换回整数,即 CD FB C7 C7 -> 3455829959 该函数的一个用例是反转 IPv4:
x— 整数值。(U)Int*
x。(U)Int*
示例
使用示例
Query
Response
Query
Response
Query
Response
Query
Response
Query
Response
divide
引入版本:v1.1.0 计算两个值a 和 b 的商。结果类型始终为 Float64。
整数除法请使用 intDiv 函数。
除数为
0 时,会返回 inf、-inf 或 nan。x— 被除数;y— 除数
Query
Response
Query
Response
divideDecimal
Introduced in: v22.12.0 对两个 Decimal 执行除法运算。结果值的类型为 Decimal256。 结果标度可通过result_scale 参数 (取值范围为 [0, 76] 的常量 Integer) 显式指定。若未指定,则结果标度为给定参数中的最大标度。
此函数的执行速度明显慢于常规的
divide。
如果你并不需要受控精度和/或需要更快的计算速度,请考虑使用 divide。Decimal256
示例
示例 1
Query
Response
Query
Response
divideOrNull
在 v25.5.0 中引入 与divide 相同,但在除数为零时返回 NULL。
语法
x— 被除数 -y— 除数
Query
Response
gcd
引入版本:v1.1.0 返回两个值 a 和 b 的最大公约数。 当除数为零,或将最小负数除以负一时, 会抛出异常。 语法x— 第一个整数 -y— 第二个整数
x 和 y 的最大公因数。
示例
使用示例
Query
Response
ifNotFinite
Introduced in: v20.3.0 检查浮点值是否为有限值。 你也可以使用三元运算符获得类似的结果:isFinite(x) ? x : y。
语法
- 如果
x是有限值,则返回x。 - 如果
x不是有限值,则返回y。
Query
Response
intDiv
Introduced in: v1.1.0 对两个值x 和 y 执行整数除法。也就是说,
计算向下取整后的商。
结果与被除数 (第一个参数) 的位宽相同。
当除以零、商超出被除数的取值范围,或将最小负数除以负一时,
会抛出异常。
语法
x— 左操作数。-y— 右操作数。
x 与 y 整数相除的结果
示例
两个浮点数的整数除法
Query
Response
Query
Response
intDivOrNull
引入版本:v25.5.0 与intDiv 相同,但在除数为零或将最小负数除以负一时返回 NULL。
语法
x 与 y 做整数除法的结果,或 NULL。
示例
被零除的整数除法
Query
Response
Query
Response
intDivOrZero
引入版本:v1.1.0 与intDiv 相同,但在除数为零,或将最小负数除以负一时返回零。
语法
a 与 b 做整数除法的结果,或为零。
示例
整数除以零
Query
Response
Query
Response
isFinite
引入版本:v1.1.0 如果 Float32、Float64 或 BFloat16 参数既不是无穷大也不是NaN,则返回 1,
否则返回 0。
语法
NaN,则返回 1;否则返回 0。
示例
测试一个数是否为有限值
Query
Response
isInfinite
Introduced in: v1.1.0 如果 Float32、Float64 或 BFloat16 参数是无穷大,则返回1;否则返回 0。
请注意,参数为 NaN 时也会返回 0。
语法
1;否则返回 0 (NaN 也返回 0) 。
示例
判断一个数值是否为无穷大
Query
Response
isNaN
引入版本:v1.1.0 如果 Float32、Float64 或 BFloat16 类型的参数为NaN,则返回 1,否则返回 0。
语法
NaN,则返回 1;否则返回 0
示例
使用示例
Query
Response
kqlBin
引入版本:v26.8.0 将值向下取整为roundTo 的倍数,行为与 Kusto 查询语言的 bin() 相同。
具体规则取决于参数类型:数字按算术方式取整,时间跨度 (即 Interval) 按 时间跨度 取整,日期时间 同样按 时间跨度 取整。KQL 的 日期时间 对应 DateTime64;范围更窄的 DateTime 和 Date 载体会被拒绝,因为它们无法表示 KQL 日期时间 可能产生的所有 分桶。
当 dialect = 'kusto' 时,该函数为 bin() 提供底层实现,不适合在 SQL 中直接调用。
语法
value— 数字、时间跨度 或日期时间 (DateTime64) 。 -roundTo— 分桶 的大小。
value 向下取整到 roundTo 的最近倍数。
Examples
number
Query
Response
Query
Response
Query
Response
kqlBinAt
Introduced in: v26.8.0 将值向下取整为从fixedPoint 起算的 binSize 的整数倍,行为与 Kusto 查询语言的 bin_at() 相同。分桶的对齐位置可能位于该固定点之前或之后。
具体规则取决于参数类型:数字按算术方式舍入;时间跨度 (即 Interval) 按另一个时间跨度 舍入;日期时间 则按从某个日期时间 固定点起算的时间跨度 舍入。KQL 的 日期时间 对应 DateTime64;范围更窄的 DateTime 和 Date 载体会被拒绝,因为它们无法表示 KQL 日期时间 可能产生的所有分桶。
该函数在 dialect = 'kusto' 时为 bin_at() 提供底层实现,不应直接在 SQL 中调用。
Syntax
value— 一个数字、一个 时间跨度 或一个 日期时间 (DateTime64) 。-binSize— 分桶 大小。-fixedPoint— 分桶 的计数起点。
fixedPoint 为起点,将 value 向下取整到最接近的 binSize 倍数。
Examples
number
Query
Response
Query
Response
kqlDateTimeBinAt
引入版本:v26.8.0 将日期时间向下取整为自某个日期时间固定点起计算的时间跨度整数倍。 语法value— 需要取整的日期时间。 -binSize— 时间跨度 分桶大小。 -fixedPoint— 日期时间固定点。
kqlDivide
Introduced in: v26.8.0 按 Kusto 查询语言定义的除法:两个整数操作数相除结果为整数,因此7 / 2 为 3;两个 时间跨度 操作数 (即 Interval 值) 相除则得到实数比值,因此 15ms / 10ms 为 1.5。操作数类型的其他任意组合,其除法行为与 divide 一致。
该函数在 dialect = 'kusto' 时为 / 运算符提供底层实现,不适合直接在 SQL 中调用。
Syntax
x— 被除数。 -y— 除数。
intDiv(x, y);当两者均为时间间隔时,返回二者 tick 数之比;其他情况下返回 divide(x, y)。
示例
整数
Query
Response
Query
Response
Query
Response
kqlMultiply
引入版本:v26.8.0 按 Kusto 查询语言的定义执行乘法:时间跨度 (即Interval) 可与位于任意一侧的数字相乘进行缩放,因此 2 * 1h 表示两小时。若两个参数中都不含时间间隔,则乘法行为与 multiply 一致。
该函数用于在 dialect = 'kusto' 时实现 * 运算符,并非设计为在 SQL 中直接调用。
语法
x— 数字或时间跨度。 -y— 数字;当x为数字时,也可以是时间跨度。
Query
Response
Query
Response
kqlRangeCount
引入版本:v26.8.0 Kusto 查询语言的range source 所生成的行数:floor((to - from) / step) + 1,且永不小于零。bounds 和 step 可以是数字,也可以是以 时间跨度 (即 Interval) 为步长递进的 日期时间,或者是 时间跨度;时间类形式按整数纳秒计数,而这无法用单次 ClickHouse 除法表达。整数和 Decimal 会被精确计数,而不经由 Float64 计算。
当 dialect = 'kusto' 时,该函数为 range source 提供底层支持,并不适合直接在 SQL 中调用。
语法
from— 范围的起始值。-to— 范围不会超过的值。-step— 相邻两个值之间的差值。
Query
Response
Query
Response
lcm
引入版本:v1.1.0 返回两个值x 和 y 的最小公倍数。
当除以零,或将最小负数除以负一时,会抛出异常。
语法
x 和 y 的最小公倍数。(U)Int*
示例
用法示例
Query
Response
max2
引入版本:v21.11.0 返回两个数值x 和 y 中较大的值。
语法
x— 第一个值(U)Int8/16/32/64或Float*或BFloat16或Decimaly— 第二个值(U)Int8/16/32/64或Float*或BFloat16或Decimal
x 和 y 中的较大值。 Float64
示例
用法示例
Query
Response
midpoint
引入版本:v25.11.0 计算并返回给定参数的平均值。 支持数值类型和时间类型。 语法x1[, x2, ...]— 接受单个值或多个值,并对其求平均值。
Query
Response
Query
Response
Query
Response
Query
Response
Query
Response
min2
引入版本:v21.11.0 返回两个数值x 和 y 中较小的一个。
语法
x— 第一个值(U)Int8/16/32/64或Float*或BFloat16或Decimaly— 第二个值(U)Int8/16/32/64或Float*或BFloat16或Decimal
x 和 y 中较小的值。 Float64
示例
使用示例
Query
Response
minus
在 v1.1.0 中引入 计算两个值a 和 b 的差值。结果始终为带符号数。
与 plus 类似,也可以用日期或日期时间减去一个整数。
此外,也支持两个日期时间相减,结果为它们之间的时间差。
还可以用 DateTime 或 DateTime64 减去 Time 或 Time64;
该时间值会作为以秒为单位的偏移量应用。DateTime 减去 Time 得到
DateTime,任何涉及 DateTime64 或 Time64 的组合都会得到 DateTime64,
其标度为两个参数中的较大值。
语法
x— 被减数。 -y— 减数。
Query
Response
Query
Response
modulo
Introduced in: v1.1.0 计算两个值 a 除以 b 所得的余数。 如果两个输入都是整数,结果类型为整数。如果其中一个输入是浮点数,结果类型则为 Float64。 余数的计算方式与 C++ 相同。对于负数,使用截断除法。 当除数为零,或将最小负数除以负一时,会抛出异常。 Syntaxmod
参数
a— 被除数 -b— 除数 (模数)
Query
Response
moduloLegacy
引入版本:v1.1.0 计算除法的余数。这是使用 C++% 运算符的旧版取模实现,对于负参数,可能会产生负结果。保留此函数是为了兼容旧版表分区逻辑。标准行为请使用 modulo 或 positiveModulo。
语法
(U)Int* 或 Float*
示例
基本用法
Query
Response
moduloOrNull
引入版本:v25.5.0 计算a 除以 b 的余数。与函数 modulo 类似,不同之处在于,当该运算原本会引发浮点异常时,moduloOrNull 会返回 NULL。对于浮点参数,这种情况仅会在除数为 0 时发生;对于整数参数,还包括最小负值对 -1 取模的情况 (例如 Int8 中的 -128 % -1) 。
语法
modOrNull
参数
返回值
返回 x 除以 y 的余数;当该运算会引发浮点异常时,返回 NULL:
即当除数为零时,或者对于整数参数,在计算最小负值对 -1 取模时。
示例
除数为零时的 moduloOrNull
Query
Response
Query
Response
moduloOrZero
首次引入版本:v20.3.0 与 modulo 类似,但对于整数结果,当操作原本会引发 异常时会返回零而不是异常。对于浮点结果,零除数会产生NaN。
语法
a % b 的余数。对于整数结果,如果该操作原本会引发异常,则返回 0。
对于浮点结果,除数为零时会产生 NaN。
示例
整数除数为零
Query
Response
Query
Response
multiply
引入于:v1.1.0 计算两个值x 和 y 的乘积。
语法
Query
Response
multiplyDecimal
引入版本:v22.12.0 对两个 Decimal 执行乘法。结果值的类型为 Decimal256。 结果标度可以通过result_scale 参数 (取值范围为 [0, 76] 的常量 Integer) 显式指定。若未指定,则结果标度为给定参数中的最大标度。
这些函数的运行速度明显慢于常规的
multiply。
如果你并不需要受控精度和/或希望快速计算,请考虑使用 multiplyDecimal256
示例
使用示例
Query
Response
Query
Response
Query
Response
Query
Response
negate
引入版本:v1.1.0 对参数x 取反。结果始终为有符号数。
语法
x— 要取负值的值。
x 的相反数 -x。
示例
使用示例
Query
Response
plus
引入版本:v1.1.0 计算两个值x 和 y 的和。别名:x + y (运算符) 。
整数可以与日期或日期时间相加。前一种
运算会增加日期中的天数,后一种运算
会增加日期时间中的秒数。
日期也可以与时间相加。将 Date 与 Time
相加会生成 DateTime。将 Date 与 Time64 相加,或将 Date32 与
Time 或 Time64 相加,会生成 DateTime64。
将 Time 或 Time64 与 DateTime 或 DateTime64 相加时,该时间
值会作为以秒为单位的偏移量应用。DateTime 加 Time 会生成 DateTime;
任何涉及 DateTime64 或 Time64 的组合都会生成 DateTime64,
其标度取两个参数中较大者。
语法
x— 左操作数。 -y— 右操作数。
Query
Response
Query
Response
Query
Response
positiveModulo
引入版本:v22.11.0 计算x 除以 y 的余数。与函数
modulo 类似,不同之处在于 positiveModulo 始终返回非负数。
语法
positive_modulo, pmod
参数
返回值
返回 x 与不大于 x 且能被 y 整除的最大整数之间的差值。
示例
用法示例
Query
Response
positiveModuloOrNull
引入版本:v25.5.0 计算a 除以 b 的余数。与函数 positiveModulo 类似,不同之处在于,当该运算本应引发浮点异常时,positiveModuloOrNull 会返回 NULL。对于浮点参数,这种情况只会在除数为 0 时发生;对于整数参数,还包括最小负值对 -1 取模的情况 (例如 Int8 中的 -128 % -1) 。
语法
positive_modulo_or_null, pmodOrNull
参数
x— 被除数。(U)Int*/Float32/64。-y— 除数 (模数) 。(U)Int*/Float32/64。
x 与不大于
x 且可被 y 整除的最近整数之差;或者当该运算会引发浮点异常时返回 NULL:即除数为零,或者对于整数参数,在计算最小负值对 -1 取模时。
示例
positiveModuloOrNull 的除数为零时
Query
Response
Query
Response
sqr
引入版本:v26.7.0 计算值x 的平方。
语法
x 与其自身相乘的乘积。
示例
对数值求平方
Query
Response