Clickhouse 算术函数实战总结

Posted 扫地增

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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),moduloOrZer

以上是关于Clickhouse 算术函数实战总结的主要内容,如果未能解决你的问题,请参考以下文章

《ClickHouse企业级应用:入门进阶与实战》5 ClickHouse函数

《ClickHouse企业级应用:入门进阶与实战》5 ClickHouse函数

如何对clickhouse中的列进行算术更新?

《ClickHouse企业级应用:入门进阶与实战》6 ClickHouse SQL基础

《ClickHouse企业级应用:入门进阶与实战》6 ClickHouse SQL基础

极富参考价值!第1章 ClickHouse 简介《ClickHouse 企业级大数据分析引擎实战》...