Clickhouse 算术函数实战总结

对于所有算术函数,结果类型为结果所在的最小数值类型(如果存在这样的类型)。最小数值类型是根据数值的位数,是否有符号以及是否是浮点类型而同时进行的。如果没有足够的位,则采用最高位类型。

toTypeName(operator) 查看数据类型

函数说明:
函数用途举例结果
toTypeName(operator)返回数据的类型 ,operator的值可以是任何类型toTypeName(toDate(‘2018-12-24’))返回 Date
函数实例:
SELECT toTypeName(toDate('2021-05-20'));

┌─toTypeName(toDate('2021-05-20'))─┐
│ Date                             │
└──────────────────────────────────┘

SELECT toTypeName(0),toTypeName(0 + 0),toTypeName((0 + 0) + 0),toTypeName(((0 + 0) + 0) + 0)

┌─toTypeName(0)─┬─toTypeName(plus(0, 0))─┬─toTypeName(plus(plus(0, 0), 0))─┬─toTypeName(plus(plus(plus(0, 0), 0), 0))─┐
│ UInt8         │ UInt16                 │ UInt32                          │ UInt64                                   │
└───────────────┴────────────────────────┴─────────────────────────────────┴──────────────────────────────────────────┘

算术函数适用于UInt8,UInt16,UInt32,UInt64,Int8,Int16,Int32,Int64,Float32或Float64中的任何类型。

plus(a, b) 计算数值总和

函数说明:
函数用途举例结果
plus(a, b)计算数值总和plus(50,1)返回结果51

参数类型说明:
1、DateDateTime与整数进行相加。在Date的情况下,和整数相加整数意味着添加相应的天数,日期类型值和整数值没有顺序要求
2、对于DateTime,这意味着添加相应的秒数,时间类型值和整数值没有顺序要求
3、当然两个参数也可以是两个整数,同样没有顺序要求。

函数实例:
localhost :) select plus(50,1), plus(1,toDate('2021-05-20')),plus(toDate('2021-05-22'),-1),plus(toDateTime('2021-05-20 16:18:20'),1),plus(-1,toDateTime('2021-05-20 16:18:20'));

SELECT
    50 + 1,
    1 + toDate('2021-05-20'),
    toDate('2021-05-22') + -1,
    toDateTime('2021-05-20 16:18:20') + 1,
    -1 + toDateTime('2021-05-20 16:18:20')

Query id: 0ab418ad-5821-49df-bd6f-8456b4b3e714

┌─plus(50, 1)─┬─plus(1, toDate('2021-05-20'))─┬─plus(toDate('2021-05-22'), -1)─┬─plus(toDateTime('2021-05-20 16:18:20'), 1)─┬─plus(-1, toDateTime('2021-05-20 16:18:20'))─┐
│          512021-05-212021-05-212021-05-20 16:18:212021-05-20 16:18:19 │
└─────────────┴───────────────────────────────┴────────────────────────────────┴────────────────────────────────────────────┴─────────────────────────────────────────────┘

1 rows in set. Elapsed: 0.006 sec.

minus(a, b) 计算数值之差

函数说明:
函数用途举例结果
minus(a, b)计算数值之差,结果总是有符号的minus(10,1)返回结果9

参数类型说明:
1、DateDateTime与整数进行相减。在Date的情况下,和整数相减整数意味着减少相应的天数,日期类型值和整数值有严格顺序要求,日期类型必须为第一个参数
2、对于DateTime,这意味着添加相应的秒数,时间类型值和整数值有严格的顺序要求,时间类型必须为第一个参数
3、当然两个参数也可以是两个整数,同样没有顺序要求。

函数实例:
localhost :) select minus(10,1),minus(10,-1),minus(toDate('2021-05-22'), -1),minus(toDate('2021-05-20'),1),minus(toDateTime('2021-05-20 16:18:20'), 1),minus(toDateTime('2021-05-20 16:18:20'), -1)

SELECT
    10 - 1,
    10 - -1,
    toDate('2021-05-22') - -1,
    toDate('2021-05-20') - 1,
    toDateTime('2021-05-20 16:18:20') - 1,
    toDateTime('2021-05-20 16:18:20') - -1

Query id: 25211a35-cd6e-4c18-a321-1223092b41d5

┌─minus(10, 1)─┬─minus(10, -1)─┬─minus(toDate('2021-05-22'), -1)─┬─minus(toDate('2021-05-20'), 1)─┬─minus(toDateTime('2021-05-20 16:18:20'), 1)─┬─minus(toDateTime('2021-05-20 16:18:20'), -1)─┐
│            9112021-05-232021-05-192021-05-20 16:18:192021-05-20 16:18:21 │
└──────────────┴───────────────┴─────────────────────────────────┴────────────────────────────────┴─────────────────────────────────────────────┴──────────────────────────────────────────────┘

1 rows in set. Elapsed: 0.003 sec.

multiply(a, b) 计算数值的乘积

函数说明:
函数用途举例结果
multiply(a, b)计算数值的乘积multiply(1, 1)返回结果1

参数类型说明:
1、a、b两个参数类型可为自然数,可以为正整数,负整数,0。
2、a、b两个参数类型可为Float32类型。
3、a、b两个参数类型可为Float64类型。

函数实例:
localhost :) select multiply(-1,-1),multiply(-1,1),multiply(0,1),multiply(1,1),multiply(-1.12,1),multiply(-1.1,1)

SELECT
    -1 * -1,
    -1 * 1,
    0 * 1,
    1 * 1,
    -1.12 * 1,
    -1.1 * 1

Query id: 4778679f-10e2-46b4-8e7b-db3c1dae83ae

┌─multiply(-1, -1)─┬─multiply(-1, 1)─┬─multiply(0, 1)─┬─multiply(1, 1)─┬─multiply(-1.12, 1)─┬─multiply(-1.1, 1)─┐
│                1-101-1.12-1.1 │
└──────────────────┴─────────────────┴────────────────┴────────────────┴────────────────────┴───────────────────┘

1 rows in set. Elapsed: 0.004 sec.

divide(a, b) 计算数值的商

函数说明:
函数用途举例结果
divide(a, b)计算数值的商 ,结果类型始终是浮点类型。divide(1, 1)返回结果1

参数类型说明:
1、a、b两个参数类型可为自然数,可以为正整数,负整数,0。
2、a、b两个参数类型可为Float32类型。
3、a、b两个参数类型可为Float64类型。
注意:
它不是整数除法。对于整数除法,请使用’intDiv’函数。当除以零时,你得到’inf’,‘- inf’或’nan’。

函数实例:
localhost :) select divide(-1,-1),divide(-1,1),divide(0,1),divide(1,1),divide(-1,1.12),divide(-1.1,1),divide(1.1, 0),divide(-1.1, 0),divide(0,0)

SELECT
    -1 / -1,
    -1 / 1,
    0 / 1,
    1 / 1,
    -1 / 1.12,
    -1.1 / 1,
    1.1 / 0,
    -1.1 / 0,
    0 / 0

Query id: 475d947c-fd6f-49f2-bcc8-e80ecb19a9d6

┌─divide(-1, -1)─┬─divide(-1, 1)─┬─divide(0, 1)─┬─divide(1, 1)─┬────divide(-1, 1.12)─┬─divide(-1.1, 1)─┬─divide(1.1, 0)─┬─divide(-1.1, 0)─┬─divide(0, 0)─┐
│              1-101-0.8928571428571428-1.1 │            inf │            -inf │          nan │
└────────────────┴───────────────┴──────────────┴──────────────┴─────────────────────┴─────────────────┴────────────────┴─────────────────┴──────────────┘

1 rows in set. Elapsed: 0.003 sec.

intDiv(a,b) 计算数值的商

函数说明:
函数用途举例结果
intDiv(a, b)计算数值的商,向下舍入取整(按绝对值),除以零或将最小负数除以-1时抛出异常。intDiv(1, 1)返回结果1

参数类型说明:
1、a、b两个参数类型可为自然数,可以为正整数,负整数,0。
2、a、b两个参数类型可为Float32类型。
3、a、b两个参数类型可为Float64类型。
注意:
除以零或将最小负数除以-1时抛出异常。

函数实例:
localhost :) select intDiv(1,1),intDiv(-1,-1),intDiv(-1,1),intDiv(0,1),intDiv(-inf,-1),intDiv(-1,1.12),intDiv(-1,1)

SELECT
    intDiv(1, 1),
    intDiv(-1, -1),
    intDiv(-1, 1),
    intDiv(0, 1),
    intDiv(-inf, -1),
    intDiv(-1, 1.12),
    intDiv(-1, 1)

Query id: d081081f-59e1-464a-949f-d4da676aab5d

┌─intDiv(1, 1)─┬─intDiv(-1, -1)─┬─intDiv(-1, 1)─┬─intDiv(0, 1)─┬─────intDiv(-inf, -1)─┬─intDiv(-1, 1.12)─┬─intDiv(-1, 1)─┐
│            11-10-92233720368547758080-1 │
└──────────────┴────────────────┴───────────────┴──────────────┴──────────────────────┴──────────────────┴───────────────┘

1 rows in set. Elapsed: 0.003 sec.

intDivOrZero(a,b)

函数说明:
函数用途举例结果
intDivOrZero(a, b)计算数值的商,向下舍入取整(按绝对值),与’intDiv’的不同之处在于它在除以零或将最小负数除以-1时返回零。intDivOrZero(1, 1)返回结果1

参数类型说明:
1、a、b两个参数类型可为自然数,可以为正整数,负整数,0。
2、a、b两个参数类型可为Float32类型。
3、a、b两个参数类型可为Float64类型。
注意:
除以零或将最小负数除以-1时抛出异常。

函数实例:
localhost :)  select intDivOrZero(1,1),intDivOrZero(-1,-1),intDivOrZero(-1,1),intDivOrZero(0,1),intDivOrZero(-inf,-1),intDivOrZero(-1,1.12),intDiv(-1,1)

SELECT
    intDivOrZero(1, 1),
    intDivOrZero(-1, -1),
    intDivOrZero(-1, 1),
    intDivOrZero(0, 1),
    intDivOrZero(-inf, -1),
    intDivOrZero(-1, 1.12),
    intDiv(-1, 1)

Query id: ff421b79-5374-4302-8f38-4235714a0cf0

┌─intDivOrZero(1, 1)─┬─intDivOrZero(-1, -1)─┬─intDivOrZero(-1, 1)─┬─intDivOrZero(0, 1)─┬─intDivOrZero(-inf, -1)─┬─intDivOrZero(-1, 1.12)─┬─intDiv(-1, 1)─┐
│                  11-10-92233720368547758080-1 │
└────────────────────┴──────────────────────┴─────────────────────┴────────────────────┴────────────────────────┴────────────────────────┴───────────────┘

1 rows in set. Elapsed: 0.003 sec.

modulo(a, b) 计算除法后的余数。

函数说明:
函数用途举例结果
modulo(a, b)计算除法后的余数。除以零或将最小负数除以-1时抛出异常。modulo(1, 1)返回结果0

参数类型说明:
1、如果参数是浮点数,则通过删除小数部分将它们预转换为整数。
2、其余部分与C++中的含义相同。截断除法用于负数。
注意:
除以零或将最小负数除以-1时抛出异常。

函数实例:
localhost :)  select modulo(1,1),modulo(-1.13301,-1),modulo(-1.12,1),modulo(0,1),modulo(-inf,-1),modulo(-1,1.12),modulo(-1,1)

SELECT
    1 % 1,
    -1.13301 % -1,
    -1.12 % 1,
    0 % 1,
    -inf % -1,
    -1 % 1.12,
    -1 % 1

Query id: 3bd0704a-8c10-4f37-b6c5-68414b76b1c1

┌─modulo(1, 1)─┬─modulo(-1.13301, -1)─┬────modulo(-1.12, 1)─┬─modulo(0, 1)─┬─modulo(-inf, -1)─┬─modulo(-1, 1.12)─┬─modulo(-1, 1)─┐
│            0-0.13301000000000007-0.12000000000000010 │              nan │               -10 │
└──────────────┴──────────────────────┴─────────────────────┴──────────────┴──────────────────┴──────────────────┴───────────────┘

1 rows in set. Elapsed: 0.002 sec.

moduloOrZero(a, b)

函数说明:
函数用途举例结果
moduloOrZero(a, b)计算除法后的余数。除以零或将最小负数除以-1时抛出异常。和modulo不同之处在于,除以0时结果返回0。moduloOrZero(1, 1)返回结果0
函数实例:
localhost :)  select moduloOrZero(1,1),moduloOrZero(-1.13301,-1),moduloOrZero(-1.12,1),moduloOrZero(0,1),moduloOrZero(-inf,-1),moduloOrZero(-1,1.12),moduloOrZero(-1,1),moduloOrZero(-1,0)

SELECT
    moduloOrZero(1, 1),
    moduloOrZero(-1.13301, -1),
    moduloOrZero(-1.12, 1),
    moduloOrZero(0, 1),
    moduloOrZero(-inf, -1),
    moduloOrZero(-1, 1.12),
    moduloOrZero(-1, 1),
    moduloOrZero(-1, 0)

Query id: f654ef31-1dc3-4d69-b535-643615d6545c

┌─moduloOrZero(1, 1)─┬─moduloOrZero(-1.13301, -1)─┬─moduloOrZero(-1.12, 1)─┬─moduloOrZero(0, 1)─┬─moduloOrZero(-inf, -1)─┬─moduloOrZero(-1, 1.12)─┬─moduloOrZero(-1, 1)─┬─moduloOrZero(-1, 0)─┐
│                  0-0.13301000000000007-0.12000000000000010 │                    nan │                     -100 │
└────────────────────┴────────────────────────────┴────────────────────────┴────────────────────┴────────────────────────┴────────────────────────┴─────────────────────┴─────────────────────┘

1 rows in set. Elapsed: 0.004 sec.

negate(a) 取反函数

函数说明:
函数用途举例结果
negate(a)通过改变数值的符号位对数值取反,结果总是有符号的negate(1)返回结果-1
函数实例:
localhost :) select negate(1),negate(-1),negate(0),negate(1.11),negate(-1.11)

SELECT
    - 1,
    - -1,
    - 0,
    - 1.11,
    - -1.11

Query id: 8b24845e-2e86-4011-995e-cfc94f8602ac

┌─negate(1)─┬─negate(-1)─┬─negate(0)─┬─negate(1.11)─┬─negate(-1.11)─┐
│        -110-1.111.11 │
└───────────┴────────────┴───────────┴──────────────┴───────────────┘

1 rows in set. Elapsed: 0.003 sec.

abs(a) 绝对值函数

函数说明:
函数用途举例结果
abs(a)计算数值(a)的绝对值abs(1)返回结果1

1、如果a < 0,它返回-a。
2、对于无符号类型,它不执行任何操作。
3、对于有符号整数类型,它返回无符号数。

函数实例:
localhost :) select abs(1),abs(-1),abs(0),abs(1.11),abs(-1.11)

SELECT
    abs(1),
    abs(-1),
    abs(0),
    abs(1.11),
    abs(-1.11)

Query id: fd55b288-fa59-478c-87f2-78966499d011

┌─abs(1)─┬─abs(-1)─┬─abs(0)─┬─abs(1.11)─┬─abs(-1.11)─┐
│      1101.111.11 │
└────────┴─────────┴────────┴───────────┴────────────┘

1 rows in set. Elapsed: 0.003 sec.

gcd(a,b) 计算两数值最大公约数

函数说明:
函数用途举例结果
gcd(a,b)返回数值的最大公约数。除以零或将最小负数除以-1时抛出异常。gcd(12,3)返回结果3
函数实例:
localhost :) select gcd(123,26)

SELECT gcd(123, 26)

Query id: 853fb8c2-ecc9-4fff-8465-d1347af48d49

┌─gcd(123, 26)─┐
│            1 │
└──────────────┘

1 rows in set. Elapsed: 0.002 sec.

lcm(a,b) 计算两数值最小公倍数

函数说明:
函数用途举例结果
lcm(a,b)返回数值的最小公倍数。除以零或将最小负数除以-1时抛出异常。lcm(12,3)返回结果12
函数实例:
SELECT lcm(123, 26)

Query id: c3f77245-a338-4809-98ef-684c0b1dc93d

┌─lcm(123, 26)─┐
│         3198 │
└──────────────┘

1 rows in set. Elapsed: 0.002 sec.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扫地增

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值