
# 数学函数和运算符
#### 数学运算符
| 运算符 | 描述 |
|:---|:---|
| +   | 加  |
| -   | 减  |
| \*  | 乘  |
| /   | 除  |
| %   | 取余 |
   
#### 数学函数
- abs(x) → \[same as input\] 返回x的绝对值
  ```
  SELECT abs(-17.4);-- 17.4
  ```
  
- bin(bigint x) -\> string 返回x的二进制格式
  ```
  select bin(5); --101
  ```
  
- bround(double x) -\> double 银行家舍入法：
  - 1\~4：舍
  
  - 6\~9：进
  
  - 5的前位数是偶数：舍
  
  - 5的前位数是奇数：进
  
  
  ```
  select bround(3.5); -- 4.0
  select bround(2.5); -- 2.0
  select bround(3.4); -- 3.0
  ```
  
- bround(double x, int y) -\> double 保留y位小数的银行家舍入法
  ```
  select bround(8.35,1); --8.4
  select bround(8.355,2); --8.36
  ```
  
- ceil(x) → \[same as input\] 同ceiling()
  ```
  SELECT ceil(-42.8); -- -42
  ```
  ceiling(x) → \[same as input\]
  返回x的向上取整的数值
  ```
  SELECT ceiling(-42.8); -- -42
  ```
  
- conv(bigint num, int from_base, int to_base)
- conv(string num, int from_base, int to_base) 对num做进制转换操作，示例为从10进制转为2进制
  ```
  select conv('123',10,2); -- 1111011
  ```
  
- rand() → double 返回0到1之间的随机小数
  ```
  select rand();--  0.049510824616263105
  ```
  
- cbrt(x) → double 返回x的立方根
  ```
  SELECT cbrt(27.0); -- 3
  ```
  

- e() → double 返回欧拉常数
  ```
  select e();-- 2.718281828459045
  ```
  

- exp(x) → double 返回e的x次方
  ```
  select exp(1);--2.718281828459045
  ```
  
- factorial(int x) -\> bigint 返回x的阶乘，x的有效值范围\[0,20\]
  ```
  select factorial(4); --24
  ```
  
- floor(x) → \[same as input\] 返回x舍入最接近的整数
  ```
  SELECT floor(-42.8);-- -43
  ```
  

- from_base(string, radix) → bigint 将一个指定进制数转为bigint，如将3进制数'200' 转为十进制数
  ```
  select from_base('200',3);--18
  ```
  
- hex(bigint\|string\|binary x) -\> string 如果x为int或二进制形式，则十六进制格式数字以string类型返回。否则，如果x为string，则会将字符串的每个字符转换为十六进制表示形式，并返回结果string
  ```
  select hex(68); -- 44
  select hex('AE'); -- 4145
  ```
  
- to_base(*x* , *radix* ) → varchar
  将一个整数转成radix进制数的字符表示，如将十进制的18转为3进制的表示法
  ```
  select to_base(18,3);-- 200
  ```
  
- ln(x) → double 返回x的自然对数
  ```
  select ln(10);--2.302585092994046
  select ln(e());--1.0
  ```
  

- log2(x) → double 返回x的以2为底的对数
  ```
  select log2(4);-- 2.0
  ```
  
- log10(x) → double 返回x的以10为底的对数
  ```
  select log10(1000);-- 3.0
  ```
  
- log(b, x) → double 返回x的以b为底的对数
  ```
  select log(3,81); -- 4.0
  ```
  
- mod(n, m) → \[same as input\] 返回n除以m的模数
  ```
  select mod(40,7) ;-- 5
  select mod(-40,7);  -- -5
  ```
  
- pi() → double 返回圆周率
  ```
  select pi();--3.141592653589793
  ```
  
- pmod(int x,int y) -\> int
- pmod(double x,double y) -\> double 返回x除y的余数的绝对值
  ```
  select pmod(8,3); --2
  Select pmod(8.35,2.0); --0.35
  ```
  
- pow(x, p) → double 同power()
  ```
  select pow(3.2,3);-- 32.76800000000001
  ```
  
- power(x,p) 返回x的p次方
  ```
  select power(3.2,3);-- 32.76800000000001
  ```
  
- radians(x) → double 将角度x转为弧度
  ```
  select radians(57.29577951308232);-- 1.0
  ```
  
- degrees(x) → double 将角度x（以弧度表示）转为角度
  ```
  select degrees(1);-- 57.29577951308232
  ```
  
- round(*x* ) → \[same as input\]
  返回x舍入到最近的整数
  ```
  select round(8.57);-- 9
  ```
  
- round(*x* , *d* ) → \[same as input\]
  x四舍五入到保留d位小数
  ```
  select round(8.57,1);-- 8.60
  ```
  
- shiftleft(tinyint\|smallint\|int x, int y) -\> int
- shiftleft(bigint x, int y) -\> bigint 返回x左移y个位置的值
  ```
  select shiftleft(8,2);--32
  ```
  
- shiftright(tinyint\|smallint\|int a, int b) -\> int
- shiftright(bigint a, int b) -\> bigint 返回x右移y个位置的值
  ```
  select shiftright(8,2);--2
  ```
  
- shiftrightunsigned(tinyint\|smallint\|int x, int y) -\> int
- shiftrightunsigned(bigint x, int y) -\> bigint 按位无符号右移，返回x右移y个位置的值。当x为tinyint、smallint、int时，返回int类型；当x为bigint时，返回bigint类型
  ```
  select shiftrightunsigned(8,3); -- 1
  ```
  
- sign(*x* ) → \[same as input\]
  返回x的符号函数
  - 如果x=0，返回0
  
  - x\<0，返回-1
  
  - x\>0，返回1
  
  
  ```
  select sign(-32.133);-- -1
  select sign(32.133); -- 1
  select sign(0);--0
  ```
  对于double类型的参数
  - 参数是NaN，返回NaN
  
  - 参数是+∞，返回1
  
  - 参数是-∞，返回-1
  
  
  ```
  select sign(NaN());--NaN
  select sign(Infinity());-- 1.0
  select  sign(-infinity());-- -1.0
  ```
  
- sqrt(*x* ) → double
  返回x的平方根
  ```
  select sqrt(100); -- 10.0
  ```
  
- truncate(*number,num_digits* )
  - Number需要截尾取整的数字，Num_digits用于指定取整精度的数字
  
  - Num_digits的默认值为 0
  
  - truncate ()函数截取时不进行四舍五入
  
  
  ```
  select truncate(10.526); -- 10
  select truncate(10.526,2); --  10.520
  ```
  
- trunc(*number,num_digits* ) 参考truncate(*number,num_digits*)
- unhex(string x) -\> binary 返回十六进制的倒数
  ```
  select unhex('123'); --^A#
  ```
  
- width_bucket(*x* , *bound1* , *bound2* , *n* ) → bigint
  在具有指定bound1和bound2边界以及n个存储桶的等宽直方图中返回x的容器数量
  ```
  select value,width_bucket(value,1,5000,10) from (values (1),(100),(500),(1000),(2000),(2500),(3000),(4000),(4500),(5000),(8000)) as t(value);
  value | _col1 
  ---|-------
       1 |     1 
     100 |     1 
     500 |     1 
    1000 |     2 
    2000 |     4 
    2500 |     5 
    3000 |     6 
    4000 |     8 
    4500 |     9 
    5000 |    11 
    8000 |    11
  (11 rows)
  ```
  
- width_bucket(*x* , *bins* ) → bigint
  根据数组bin指定的bin返回x的bin数量。bins参数必须是双精度数组，并假定为升序排列
  ```
  select width_bucket(x,array [1.00,2.89,3.33,4.56,5.87,15.44,20.78,30.77]) from (values (3),(4)) as t(x);
   _col0 
  -------
       2 
       3 
  (2 rows)
  ```
  
- quotient(BIGINT numerator, BIGINT denominator)→bigint 描述：计算左边数字除以右边数字的值，会抛弃部分小数部分的值
  ```
  select quotient(25,4);-- 6
  ```
  
 
#### 随机数
- rand() → double 同random()
  

- random() → double 返回范围为0.0 \<= x \<1.0的伪随机值
  ```
  select random();-- 0.021847965885988363
  select random();-- 0.5894438037549372
  ```
  

- random(*n* ) → \[same as input\]
  返回介于0和n（不包括n）之间的伪随机数
  ```
  select random(5);-- 2
  ```
  
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/notice_3.0-zh-cn.png)
random(n)包含数据类型tinyint，bigint，smallint，integer。
#### 统计学函数
二项分布的置信区间有多种计算公式，最常见的是\["正态区间"\]，但是，它只适用于样本较多的情况（np \> 5且n(1 - p) \> 5），对于小样本，它的准确性很差。于是采用威尔逊区间：
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002092831210.png "点击放大")
z ------ 正态分布，均值+ z \* 标准差置信度。 z = 1.96，置信度为95%
以好评率统计为例，pos是好评数，n是评论总数，phat是好评率
z = 1.96
phat= 1.0\* pos/n
z1=phat + z \* z/(2 \* n)
z2= ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_formulaimage_0000002128270853.png)
m= (1 + z \* z / n)
下界值(z1-z2)/m，上界值 (z1+z2)/m
- wilson_interval_lower(successes, trials, z) → double 返回伯努利试验过程的威尔逊分数区间的下界，置信值由z分数z指定。
  ```
  select wilson_interval_lower(1, 5, 1.96);-- 0.036223160969787456
  ```
  

- wilson_interval_upper(successes, trials, z) → double 返回伯努利试验过程的威尔逊分数区间的上界，置信值由z分数z指定。
  ```
  select wilson_interval_upper(1, 5, 1.96);--  0.6244717358814612
  ```
  

- cosine_similarity(*x* , *y* ) → double
  返回稀疏向量x和y之间的余弦相似度。
  ```
  SELECT cosine_similarity (MAP(ARRAY['a'],ARRAY[1.0]),MAP(ARRAY['a'],ARRAY[2.0]));-- 1.0
  ```
  
 
#### 累计分布函数
- beta_cdf(*a* , *b* , *v*) → double
用给定的a，b参数计算贝塔分布的累计分布函数：P（N \<v; a，b）。参数a，b必须为正实数，而值v必须为实数。值v必须位于间隔\[0，1\]上。
beta分布的累积分布函数公式也称为不完全beta函数比(常用Ix表示)，对应公式：
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002128390537.png "点击放大")
```
select beta_cdf(3,4,0.0004); --  1.278848368599041E-9
```
- inverse_beta_cdf(*a* , *b* , *p* ) → double
  贝塔累计分布函数的逆运算，通过给定累计概率p的a和b参数：P（N \<n）。参数a，b必须为正实数，p在区间\[0,1\]上。
  ```
  select inverse_beta_cdf(2, 5, 0.95) ;--0.5818034093775719
  ```
  
- inverse_normal_cdf(*mean* , *sd* , *p* ) → double
  给定累积概率（p）：P（N \<n）相关的均值和标准偏差，计算正态累计分布函数的逆。平均值必须是实数值，标准偏差必须是正实数值。概率p必须位于间隔（0，1）上。
  ```
  select inverse_normal_cdf(2, 5, 0.95);-- 10.224268134757361
  ```
  

- normal_cdf(*mean* , *sd* , *v* ) → double
  给定平均值和标准差，计算正态分布函数值。P(N\<v;mean,sd)，平均值和v必须是实数值，标准差必须是正实数值。
  ```
  select normal_cdf(2, 5, 0.95);--  0.4168338365175577
  ```
  
#### 三角函数
所有三角函数的参数都是以弧度表示。参考单位转换函数degrees()和radians()。
- acos(x) → double 求反余弦值。
  ```
  SELECT acos(-1);-- 3.14159265358979
  ```
  
- asin(x) → double 求反正弦值。
  ```
  SELECT asin(0.5);-- 0.5235987755982989
  ```
  
- atan(x) → double 求x的反正切值。
  ```
  SELECT atan(1);-- 0.7853981633974483
  ```
  
- atan2(y, x) → double 返回y/x的反正切值。
  ```
  SELECT atan2(2,1);-- 1.1071487177940904
  ```
  
- cos(x) → double 返回x的余弦值。
  ```
  SELECT cos(-3.1415927);-- -0.9999999999999989
  ```
  
- cosh(x) → double 返回x的双曲余弦值。
  ```
  SELECT cosh(3.1415967);-- 11.592000006553231
  ```
  
- sin(x) → double 求x的正弦值。
  ```
  SELECT sin(1.57079);--  0.9999999999799858
  ```
  
- tan(x) → double 求x的正切值。
  ```
  SELECT tan(20);-- 2.23716094422474
  ```
  
- tanh(x) → double 求x双曲正切值。
  ```
  select tanh(3.1415927);-- 0.9962720765661324
  ```
  
 
#### 浮点函数
- infinity() → double 返回表示正无穷大的常数。
  ```
  select infinity();-- Infinity
  ```
  
- is_finite(x) → boolean 判断x是否有限值。
  ```
  select is_finite(infinity());-- false
  select is_finite(50000);--true
  ```
  
- is_infinite(x) → boolean 判断x是否无穷大。
  ```
  select is_infinite(infinity());-- true
  select is_infinite(50000);--false
  ```
  
- is_nan(x) → boolean 判断x是否非数字。
  ```
  --输入的值必须为double类型
  select is_nan(null); -- NULL
  select is_nan(nan()); -- true
  select is_nan(45);-- false
  ```
  
- nan() → double 返回表示非数字的常数。
  ```
  select nan(); -- NaN
  ```
  
 
