数学函数

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

所有数学函数都具有以下行为:

  • 如果任一输入参数为 NULL,则返回 NULL
  • 如果任一参数为 NaN,则返回 NaN

ABS

ABS(X)

说明

计算绝对值。如果参数是整数,而输出值无法用同一类型表示,则返回一个错误;仅最大负输入值(不具有正数表示形式)会发生此情况。

X ABS(X)
25 25
-25 25
+inf +inf
-inf +inf

返回数据类型

INPUTINT64NUMERICBIGNUMERICFLOAT64
输出INT64NUMERICBIGNUMERICFLOAT64

SIGN

SIGN(X)

说明

分别对负参数、零和正参数返回 -10+1。对于浮点参数,此函数不区分正零和负零。

X SIGN(X)
25 +1
0 0
-25 -1
NaN NaN

返回数据类型

INPUTINT64NUMERICBIGNUMERICFLOAT64
输出INT64NUMERICBIGNUMERICFLOAT64

IS_INF

IS_INF(X)

说明

如果值为正无穷或负无穷,则返回 TRUE

X IS_INF(X)
+inf TRUE
-inf TRUE
25 FALSE

IS_NAN

IS_NAN(X)

说明

如果值为 NaN 值,则返回 TRUE

X IS_NAN(X)
NaN TRUE
25 FALSE

IEEE_DIVIDE

IEEE_DIVIDE(X, Y)

说明

用 X 除以 Y;此函数始终有效。返回 FLOAT64。不同于除法运算符 (/),如果除数为零或溢出,此函数不会生成错误。

X Y IEEE_DIVIDE(X, Y)
20.0 4.0 5.0
0.0 25.0 0.0
25.0 0.0 +inf
-25.0 0.0 -inf
0.0 0.0 NaN
0.0 NaN NaN
NaN 0.0 NaN
+inf +inf NaN
-inf -inf NaN

RAND

RAND()

说明

在范围 [0, 1)(包含 0,不包含 1)内生成 FLOAT64 类型的伪随机值。

SQRT

SQRT(X)

说明

计算 X 的平方根。如果 X 小于 0,则生成错误。

X SQRT(X)
25.0 5.0
+inf +inf
X < 0 错误

返回数据类型

INPUTINT64NUMERICBIGNUMERICFLOAT64
输出FLOAT64NUMERICBIGNUMERICFLOAT64

POW

POW(X, Y)

说明

返回 X 的 Y 次幂的值。如果结果下溢且不可表示,则函数返回值 0。

X Y POW(X, Y)
2.0 3.0 8.0
1.0 任何值(包括 NaN 1.0
任何值(包括 NaN 0 1.0
-1.0 +inf 1.0
-1.0 -inf 1.0
ABS(X) < 1 -inf +inf
ABS(X) > 1 -inf 0.0
ABS(X) < 1 +inf 0.0
ABS(X) > 1 +inf +inf
-inf Y < 0 0.0
-inf Y > 0 如果 Y 为奇整数,则为 -inf;否则为 +inf
+inf Y < 0 0
+inf Y > 0 +inf
有限值 < 0 非整数 错误
0 有限值 < 0 错误

返回数据类型

返回数据类型由下表中的参数类型决定。

INPUTINT64NUMERICBIGNUMERICFLOAT64
INT64FLOAT64NUMERICBIGNUMERICFLOAT64
NUMERICNUMERICNUMERICBIGNUMERICFLOAT64
BIGNUMERICBIGNUMERICBIGNUMERICBIGNUMERICFLOAT64
FLOAT64FLOAT64FLOAT64FLOAT64FLOAT64

POWER

POWER(X, Y)

说明

相当于 POW(X, Y)

EXP

EXP(X)

说明

计算 e 的 X 次幂,也被称为自然指数函数。如果结果下溢,此函数返回 0。如果结果上溢,则生成错误。

X EXP(X)
0.0 1.0
+inf +inf
-inf 0.0

返回数据类型

INPUTINT64NUMERICBIGNUMERICFLOAT64
输出FLOAT64NUMERICBIGNUMERICFLOAT64

LN

LN(X)

说明

计算 X 的自然对数。如果 X 小于或等于 0,则生成错误。

X LN(X)
1.0 0.0
+inf +inf
X < 0 错误

返回数据类型

INPUTINT64NUMERICBIGNUMERICFLOAT64
输出FLOAT64NUMERICBIGNUMERICFLOAT64

LOG

LOG(X [, Y])

说明

如果只存在 X,则 LOG 相当于 LN。如果还存在 Y,则 LOG 计算以 Y 为底数的 X 的对数。

X Y LOG(X, Y)
100.0 10.0 2.0
-inf 任意值 NaN
任意值 +inf NaN
+inf 0.0 < Y < 1.0 -inf
+inf Y > 1.0 +inf
X <= 0 任意值 错误
任意值 Y <= 0 错误
任意值 1.0 错误

返回数据类型

INPUTINT64NUMERICBIGNUMERICFLOAT64
INT64FLOAT64NUMERICBIGNUMERICFLOAT64
NUMERICNUMERICNUMERICBIGNUMERICFLOAT64
BIGNUMERICBIGNUMERICBIGNUMERICBIGNUMERICFLOAT64
FLOAT64FLOAT64FLOAT64FLOAT64FLOAT64

LOG10

LOG10(X)

说明

LOG 类似,但计算的是以 10 为底数的对数。

X LOG10(X)
100.0 2.0
-inf NaN
+inf NaN
X <= 0 错误

返回数据类型

INPUTINT64NUMERICBIGNUMERICFLOAT64
输出FLOAT64NUMERICBIGNUMERICFLOAT64

GREATEST

GREATEST(X1,...,XN)

说明

返回 X1,...,XN 中的最大值。如果任何参数为 NULL,则返回 NULL。另外,对于浮点参数,如果任何参数为 NaN,则返回 NaN。在所有其他情况下,根据 ORDER BY 子句使用的顺序返回 X1,...,XN 中具有最高值的值。参数 X1, ..., XN 必须可强制转换为常用超类型,并且超类型必须支持排序。

X1,...,XN GREATEST(X1,...,XN)
3,5,1 5

此函数支持指定排序规则

返回数据类型

输入值的数据类型。

LEAST

LEAST(X1,...,XN)

说明

返回 X1,...,XN 中的最小值。如果任何参数为 NULL,则返回 NULL。另外,对于浮点参数,如果任何参数为 NaN,则返回 NaN。在所有其他情况下,根据 ORDER BY 子句使用的顺序返回 X1,...,XN 中具有最小值的值。参数 X1, ..., XN 必须可强制转换为常用超类型,并且超类型必须支持排序。

X1,...,XN LEAST(X1,...,XN)
3,5,1 1

此函数支持指定排序规则

返回数据类型

输入值的数据类型。

DIV

DIV(X, Y)

说明

返回 X 被 Y 整除的结果。如果除数为 0,则返回一个错误。除数为 -1 时可能溢出。

X Y DIV(X, Y)
20 4 5
12 -7 -1
20 3 6
0 20 0
20 0 错误

返回数据类型

返回数据类型由下表中的参数类型决定。

INPUTINT64NUMERICBIGNUMERIC
INT64INT64NUMERICBIGNUMERIC
NUMERICNUMERICNUMERICBIGNUMERIC
BIGNUMERICBIGNUMERICBIGNUMERICBIGNUMERIC

SAFE_DIVIDE

SAFE_DIVIDE(X, Y)

说明

等同于除法运算符 (X / Y),但如果发生错误(例如除以 0 这个错误),则返回 NULL

XYSAFE_DIVIDE(X, Y)
2045
0200
200NULL

返回数据类型

INPUTINT64NUMERICBIGNUMERICFLOAT64
INT64FLOAT64NUMERICBIGNUMERICFLOAT64
NUMERICNUMERICNUMERICBIGNUMERICFLOAT64
BIGNUMERICBIGNUMERICBIGNUMERICBIGNUMERICFLOAT64
FLOAT64FLOAT64FLOAT64FLOAT64FLOAT64

SAFE_MULTIPLY

SAFE_MULTIPLY(X, Y)

说明

等同于乘法运算符 (*),但如果发生溢出,则返回 NULL

XYSAFE_MULTIPLY(X, Y)
20480

返回数据类型

INPUTINT64NUMERICBIGNUMERICFLOAT64
INT64INT64NUMERICBIGNUMERICFLOAT64
NUMERICNUMERICNUMERICBIGNUMERICFLOAT64
BIGNUMERICBIGNUMERICBIGNUMERICBIGNUMERICFLOAT64
FLOAT64FLOAT64FLOAT64FLOAT64FLOAT64

SAFE_NEGATE

SAFE_NEGATE(X)

说明

等同于一元取反运算符 (-),但如果发生溢出,则返回 NULL

XSAFE_NEGATE(X)
+1-1
-1+1
00

返回数据类型

INPUTINT64NUMERICBIGNUMERICFLOAT64
输出INT64NUMERICBIGNUMERICFLOAT64

SAFE_ADD

SAFE_ADD(X, Y)

说明

等同于加法运算符 (+),但如果发生溢出,则返回 NULL

XYSAFE_ADD(X, Y)
549

返回数据类型

INPUTINT64NUMERICBIGNUMERICFLOAT64
INT64INT64NUMERICBIGNUMERICFLOAT64
NUMERICNUMERICNUMERICBIGNUMERICFLOAT64
BIGNUMERICBIGNUMERICBIGNUMERICBIGNUMERICFLOAT64
FLOAT64FLOAT64FLOAT64FLOAT64FLOAT64

SAFE_SUBTRACT

SAFE_SUBTRACT(X, Y)

说明

返回 X 减去 Y 的结果。等同于减法运算符 (-),但如果发生溢出,则返回 NULL

XYSAFE_SUBTRACT(X, Y)
541

返回数据类型

INPUTINT64NUMERICBIGNUMERICFLOAT64
INT64INT64NUMERICBIGNUMERICFLOAT64
NUMERICNUMERICNUMERICBIGNUMERICFLOAT64
BIGNUMERICBIGNUMERICBIGNUMERICBIGNUMERICFLOAT64
FLOAT64FLOAT64FLOAT64FLOAT64FLOAT64

MOD

MOD(X, Y)

说明

取模函数:返回 X 除以 Y 的余数。返回值的符号与 X 相同。如果 Y 为 0,则生成一个错误。

X Y MOD(X, Y)
25 12 1
25 0 错误

返回数据类型

返回数据类型由下表中的参数类型决定。

INPUTINT64NUMERICBIGNUMERIC
INT64INT64NUMERICBIGNUMERIC
NUMERICNUMERICNUMERICBIGNUMERIC
BIGNUMERICBIGNUMERICBIGNUMERICBIGNUMERIC

ROUND

ROUND(X [, N])

说明

如果只存在 X,则 ROUND 将 X 向最近的整数舍入。如果存在 N,ROUND 将 X 舍入到小数点后 N 个小数位。如果 N 为负数,则 ROUND 将舍掉小数点取整。中间数向远离 0 的方向舍入。如果发生溢出,则生成错误。

X ROUND(X)
2.0 2.0
2.3 2.0
2.8 3.0
2.5 3.0
-2.3 -2.0
-2.8 -3.0
-2.5 -3.0
0 0
+inf +inf
-inf -inf
NaN NaN

返回数据类型

INPUTINT64NUMERICBIGNUMERICFLOAT64
输出FLOAT64NUMERICBIGNUMERICFLOAT64

TRUNC

TRUNC(X [, N])

说明

如果只存在 X,则 TRUNC 将 X 向最近的整数舍入,且此整数的绝对值不超过 X 的绝对值。如果还存在 N,则 TRUNC 的行为类似于 ROUND(X, N),但始终向 0 舍入且永不溢出。

X TRUNC(X)
2.0 2.0
2.3 2.0
2.8 2.0
2.5 2.0
-2.3 -2.0
-2.8 -2.0
-2.5 -2.0
0 0
+inf +inf
-inf -inf
NaN NaN

返回数据类型

INPUTINT64NUMERICBIGNUMERICFLOAT64
输出FLOAT64NUMERICBIGNUMERICFLOAT64

CEIL

CEIL(X)

说明

返回不小于 X 的最小整数值。

X CEIL(X)
2.0 2.0
2.3 3.0
2.8 3.0
2.5 3.0
-2.3 -2.0
-2.8 -2.0
-2.5 -2.0
0 0
+inf +inf
-inf -inf
NaN NaN

返回数据类型

INPUTINT64NUMERICBIGNUMERICFLOAT64
输出FLOAT64NUMERICBIGNUMERICFLOAT64

CEILING

CEILING(X)

说明

相当于 CEIL(X)

FLOOR

FLOOR(X)

说明

返回不大于 X 的最大整数值。

X FLOOR(X)
2.0 2.0
2.3 2.0
2.8 2.0
2.5 2.0
-2.3 -3.0
-2.8 -3.0
-2.5 -3.0
0 0
+inf +inf
-inf -inf
NaN NaN

返回数据类型

INPUTINT64NUMERICBIGNUMERICFLOAT64
输出FLOAT64NUMERICBIGNUMERICFLOAT64

COS

COS(X)

说明

计算 X 的余弦,其中 X 以弧度指定。始终有效。

X COS(X)
+inf NaN
-inf NaN
NaN NaN

COSH

COSH(X)

说明

计算 X 的双曲余弦,其中 X 以弧度指定。如果发生溢出,则生成错误。

X COSH(X)
+inf +inf
-inf +inf
NaN NaN

ACOS

ACOS(X)

说明

计算 X 的反余弦的主值。返回值在 [0,π] 范围内。如果 X 是超出 [-1, 1] 范围的值,则生成错误。

X ACOS(X)
+inf NaN
-inf NaN
NaN NaN
X < -1 错误
X > 1 错误

ACOSH

ACOSH(X)

说明

计算 X 的反双曲余弦。如果 X 是小于 1 的值,则生成错误。

X ACOSH(X)
+inf +inf
-inf NaN
NaN NaN
X < 1 错误

COT

COT(X)

说明

计算 X 的角度的余切,其中 X 以弧度指定。X 可以是强制转换为 FLOAT64 的任何数据类型。支持 SAFE. 前缀。

X COT(X)
+inf NaN
-inf NaN
NaN NaN
0 Error
NULL NULL

返回数据类型

FLOAT64

示例

SELECT COT(1) AS a, SAFE.COT(0) AS b;

+---------------------+------+
| a                   | b    |
+---------------------+------+
| 0.64209261593433065 | NULL |
+---------------------+------+

COTH

COTH(X)

说明

计算 X 角度的双曲余切,其中 X 以弧度为单位。X 可以是强制转换为 FLOAT64 的任何数据类型。支持 SAFE. 前缀。

X COTH(X)
+inf 1
-inf -1
NaN NaN
0 Error
NULL NULL

返回数据类型

FLOAT64

示例

SELECT COTH(1) AS a, SAFE.COTH(0) AS b;

+----------------+------+
| a              | b    |
+----------------+------+
| 1.313035285499 | NULL |
+----------------+------+

CSC

CSC(X)

说明

计算输入角度(以弧度为单位)的余弦。X 可以是强制转换为 FLOAT64 的任何数据类型。支持 SAFE. 前缀。

X CSC(X)
+inf NaN
-inf NaN
NaN NaN
0 Error
NULL NULL

返回数据类型

FLOAT64

示例

SELECT CSC(100) AS a, CSC(-1) AS b, SAFE.CSC(0) AS c;

+----------------+-----------------+------+
| a              | b               | c    |
+----------------+-----------------+------+
| -1.97485753142 | -1.188395105778 | NULL |
+----------------+-----------------+------+

CSCH

CSCH(X)

说明

计算输入角度(以弧度为单位)的双曲余弦。X 可以是强制转换为 FLOAT64 的任何数据类型。支持 SAFE. 前缀。

X CSCH(X)
+inf 0
-inf 0
NaN NaN
0 Error
NULL NULL

返回数据类型

FLOAT64

示例

SELECT CSCH(0.5) AS a, CSCH(-2) AS b, SAFE.CSCH(0) AS c;

+----------------+----------------+------+
| a              | b              | c    |
+----------------+----------------+------+
| 1.919034751334 | -0.27572056477 | NULL |
+----------------+----------------+------+

SEC

SEC(X)

说明

计算 X 的角度的正割,其中 X 以弧度指定。X 可以是强制转换为 FLOAT64 的任何数据类型。

X SEC(X)
+inf NaN
-inf NaN
NaN NaN
NULL NULL

返回数据类型

FLOAT64

示例

SELECT SEC(100) AS a, SEC(-1) AS b;

+----------------+---------------+
| a              | b             |
+----------------+---------------+
| 1.159663822905 | 1.85081571768 |
+----------------+---------------+

SECH

SECH(X)

说明

计算 X 角度的双曲正割,其中 X 以弧度为单位。X 可以是强制转换为 FLOAT64 的任何数据类型。从不出错。

X SECH(X)
+inf 0
-inf 0
NaN NaN
NULL NULL

返回数据类型

FLOAT64

示例

SELECT SECH(0.5) AS a, SECH(-2) AS b, SECH(100) AS c;

+----------------+----------------+---------------------+
| a              | b              | c                   |
+----------------+----------------+---------------------+
| 0.88681888397  | 0.265802228834 | 7.4401519520417E-44 |
+----------------+----------------+---------------------+

SIN

SIN(X)

说明

计算 X 的正弦,其中 X 以弧度指定。始终有效。

X SIN(X)
+inf NaN
-inf NaN
NaN NaN

SINH

SINH(X)

说明

计算 X 的双曲正弦,其中 X 以弧度指定。如果发生溢出,则生成错误。

X SINH(X)
+inf +inf
-inf -inf
NaN NaN

ASIN

ASIN(X)

说明

计算 X 的反正弦的主值。返回值在 [-π/2,π/2] 范围内。如果 X 是超出 [-1, 1] 范围的值,则生成错误。

X ASIN(X)
+inf NaN
-inf NaN
NaN NaN
X < -1 错误
X > 1 错误

ASINH

ASINH(X)

说明

计算 X 的反双曲正弦。不会失效。

X ASINH(X)
+inf +inf
-inf -inf
NaN NaN

TAN

TAN(X)

说明

计算 X 的正切,其中 X 以弧度指定。如果发生溢出,则生成错误。

X TAN(X)
+inf NaN
-inf NaN
NaN NaN

TANH

TANH(X)

说明

计算 X 的双曲正切,其中 X 以弧度指定。不会失效。

X TANH(X)
+inf 1.0
-inf -1.0
NaN NaN

ATAN

ATAN(X)

说明

计算 X 的反正切的主值。返回值在 [-π/2,π/2] 范围内。不会失效。

X ATAN(X)
+inf π/2
-inf -π/2
NaN NaN

ATANH

ATANH(X)

说明

计算 X 的反双曲正切。如果 X 是超出 [-1, 1] 范围的值,则生成错误。

X ATANH(X)
+inf NaN
-inf NaN
NaN NaN
X < -1 错误
X > 1 错误

ATAN2

ATAN2(X, Y)

说明

通过使用两个参数的符号确定象限,计算 X/Y 的反正切的主值。返回值在 [-π,π] 范围内。

X Y ATAN2(X, Y)
NaN 任意值 NaN
任意值 NaN NaN
0.0 0.0 0.0
正的有限值 -inf π
负的有限值 -inf
有限值 +inf 0.0
+inf 有限值 π/2
-inf 有限值 -π/2
+inf -inf ¾π
-inf -inf -¾π
+inf +inf π/4
-inf +inf -π/4

CBRT

CBRT(X)

说明

计算 X 的立方根。X 可以是强制转换为 FLOAT64 的任何数据类型。支持 SAFE. 前缀。

X CBRT(X)
+inf inf
-inf -inf
NaN NaN
0 0
NULL NULL

返回数据类型

FLOAT64

示例

SELECT CBRT(27) AS cube_root;

+--------------------+
| cube_root          |
+--------------------+
| 3.0000000000000004 |
+--------------------+

RANGE_BUCKET

RANGE_BUCKET(point, boundaries_array)

说明

RANGE_BUCKET 会扫描已排序的数组,并返回某个点最后一次出现的位置(从 0 开始)。如果您需要将数据分组以构建分区、直方图,业务定义的规则等,此函数将非常有用。

RANGE_BUCKET 遵循以下规则:

  • 如果数组中存在该点,则返回下一个较大值的索引。

    RANGE_BUCKET(20, [0, 10, 20, 30, 40]) -- 3 is return value
    RANGE_BUCKET(20, [0, 10, 20, 20, 40, 40]) -- 4 is return value
    
  • 如果数组中不存在该点,但该点落在两个值之间,则返回较大值的索引。

    RANGE_BUCKET(25, [0, 10, 20, 30, 40]) -- 3 is return value
    
  • 如果该点小于数组中的第一个值,则返回 0。

    RANGE_BUCKET(-10, [5, 10, 20, 30, 40]) -- 0 is return value
    
  • 如果该点大于或等于数组中的最后一个值,则返回此数组的长度。

    RANGE_BUCKET(80, [0, 10, 20, 30, 40]) -- 5 is return value
    
  • 如果数组为空,则返回 0。

    RANGE_BUCKET(80, []) -- 0 is return value
    
  • 如果该点为 NULLNaN,则返回 NULL

    RANGE_BUCKET(NULL, [0, 10, 20, 30, 40]) -- NULL is return value
    
  • 点和数组的数据类型必须兼容。

    RANGE_BUCKET('a', ['a', 'b', 'c', 'd']) -- 1 is return value
    RANGE_BUCKET(1.2, [1, 1.2, 1.4, 1.6]) -- 2 is return value
    RANGE_BUCKET(1.2, [1, 2, 4, 6]) -- execution failure
    

以下情况会导致函数运行失败:

  • 数组中包含 NaNNULL 值。

    RANGE_BUCKET(80, [NULL, 10, 20, 30, 40]) -- execution failure
    
  • 数组未按升序排序。

    RANGE_BUCKET(30, [10, 30, 20, 40, 50]) -- execution failure
    

参数

  • point:一个常规值。
  • boundaries_array:一组常规值。

返回值

INT64

示例

在名为 students 的表中,根据学生的年龄,检查每个 age_group 范围中有多少条记录:

  • age_group 0(年龄在 10 岁以下)
  • age_group 1(年龄在 10 岁到 20 岁之间,不含 20 岁)
  • age_group 2(年龄在 20 岁到 30 岁之间,不含 30 岁)
  • age_group 3(年龄在 30 岁以上,含 30 岁)
WITH students AS
(
  SELECT 9 AS age UNION ALL
  SELECT 20 AS age UNION ALL
  SELECT 25 AS age UNION ALL
  SELECT 31 AS age UNION ALL
  SELECT 32 AS age UNION ALL
  SELECT 33 AS age
)
SELECT RANGE_BUCKET(age, [10, 20, 30]) AS age_group, COUNT(*) AS count
FROM students
GROUP BY 1

+--------------+-------+
| age_group    | count |
+--------------+-------+
| 0            | 1     |
| 2            | 2     |
| 3            | 3     |
+--------------+-------+