更新时间:2024-12-11 GMT+08:00

数学函数和运算符

数学运算符

运算符

描述

+

-

*

/

%

取余

数学函数

  • 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

random(n)包含数据类型tinyint,bigint,smallint,integer。

统计学函数

二项分布的置信区间有多种计算公式,最常见的是["正态区间"],但是,它只适用于样本较多的情况(np > 5且n(1 - p) > 5),对于小样本,它的准确性很差。于是采用威尔逊区间:

z —— 正态分布,均值+ z * 标准差置信度。 z = 1.96,置信度为95%

以好评率统计为例,pos是好评数,n是评论总数,phat是好评率

z = 1.96

phat= 1.0* pos/n

z1=phat + z * z/(2 * n)

z2=

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表示),对应公式:

 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