clickhouse 高阶函数记录
clickhouse 高阶函数运用
-
查看clickhouse版本
select version();
-
查看数组函数;
select * from system.functions where name like ‘%arr%’;
-
查看和数组间接相关的函数:
select * from system.functions where lower(name) like ‘%arr%’;
Clickhouse 数组函数 高阶函数_vkingnew的博客-CSDN博客_clickhouse数组函数
-
需求1: 对uuid 进行排序,然后上下2条的时间进行相减运算,然后求和该需求是特殊的,因为在保存数据的时候,2条相近的数据是一组,用uuid区分;
用到以下高阶数组
-
需求: 对查出来的数据进行排序,分组,然后22相减,然后求和; 该sql可以应对大部分日常需求
用到以下高阶数组
记录使用过的函数
-
时间函数
-
toTimeZone
将Date或DateTime转换为指定的时区。 时区是Date/DateTime类型的属性。 表字段或结果集的列的内部值(秒数)不会更改,列的类型会更改,并且其字符串表示形式也会相应更改。
`SELECT toDateTime('2019-01-01 00:00:00', 'UTC') AS time_utc, toTypeName(time_utc) AS type_utc, toInt32(time_utc) AS int32utc, toTimeZone(time_utc, 'Asia/Yekaterinburg') AS time_yekat, toTypeName(time_yekat) AS type_yekat, toInt32(time_yekat) AS int32yekat, toTimeZone(time_utc, 'US/Samoa') AS time_samoa, toTypeName(time_samoa) AS type_samoa, toInt32(time_samoa) AS int32samoa FORMAT Vertical;` `Row 1: ────── time_utc: 2019-01-01 00:00:00 type_utc: DateTime('UTC') int32utc: 1546300800 time_yekat: 2019-01-01 05:00:00 type_yekat: DateTime('Asia/Yekaterinburg') int32yekat: 1546300800 time_samoa: 2018-12-31 13:00:00 type_samoa: DateTime('US/Samoa') int32samoa: 1546300800`
toTimeZone(time_utc, 'Asia/Yekaterinburg')
把DateTime('UTC')
类型转换为DateTime('Asia/Yekaterinburg')
. 内部值 (Unixtimestamp) 1546300800 保持不变, 但是字符串表示(toString() 函数的结果值) 由time_utc: 2019-01-01 00:00:00
转换为otime_yekat: 2019-01-01 05:00:00
. -
对于DateTime参数:将值转换为UInt32类型的数字-Unix时间戳(https://en.wikipedia.org/wiki/Unix_time)。对于String参数:根据时区将输入字符串转换为日期时间(可选的第二个参数,默认使用服务器时区),并返回相应的unix时间戳。
语法
toUnixTimestamp(datetime) toUnixTimestamp(str, [timezone])
返回值
- 返回 unix timestamp.
类型:
UInt32
.
-
-
类型转换函数
-
toInt(8|16|32|64)
转换一个输入值为Int类型。这个函数包括:
toInt8(expr)
— 结果为Int8
数据类型。toInt16(expr)
— 结果为Int16
数据类型。toInt32(expr)
— 结果为Int32
数据类型。toInt64(expr)
— 结果为Int64
数据类型。
参数
expr
— 表达式返回一个数字或者代表数值类型的字符串。不支持二进制、八进制、十六进制的数字形式,有效数字之前的0也会被忽略。
返回值
整形在
Int8
,Int16
,Int32
,或者Int64
的数据类型。函数使用rounding towards zero原则,这意味着会截断丢弃小数部分的数值。
NaN and Inf转换是不确定的。具体使用的时候,请参考数值类型转换常见的问题。
例子
`SELECT toInt64(nan), toInt32(32), toInt16('16'), toInt8(8.8)` `┌─────────toInt64(nan)─┬─toInt32(32)─┬─toInt16('16')─┬─toInt8(8.8)─┐ │ -9223372036854775808 │ 32 │ 16 │ 8 │ └──────────────────────┴─────────────┴───────────────┴─────────────┘`
toInt(8|16|32|64)OrZero
这个函数需要一个字符类型的入参,然后尝试把它转为
Int (8 | 16 | 32 | 64)
,如果转换失败直接返回0。例子
select toInt64OrZero('123123'), toInt8OrZero('123qwe123')
┌─toInt64OrZero('123123')─┬─toInt8OrZero('123qwe123')─┐ │ 123123 │ 0 │ └─────────────────────────┴───────────────────────────┘
toInt(8|16|32|64)OrNull
这个函数需要一个字符类型的入参,然后尝试把它转为
Int (8 | 16 | 32 | 64)
,如果转换失败直接返回NULL
。例子
select toInt64OrNull('123123'), toInt8OrNull('123qwe123')
┌─toInt64OrNull('123123')─┬─toInt8OrNull('123qwe123')─┐ │ 123123 │ ᴺᵁᴸᴸ │ └─────────────────────────┴───────────────────────────┘
toUInt(8|16|32|64)
转换一个输入值到UInt类型。 这个函数包括:
toUInt8(expr)
— 结果为UInt8
数据类型。toUInt16(expr)
— 结果为UInt16
数据类型。toUInt32(expr)
— 结果为UInt32
数据类型。toUInt64(expr)
— 结果为UInt64
数据类型。
参数
expr
— 表达式返回一个数字或者代表数值类型的字符串。不支持二进制、八进制、十六进制的数字形式,有效数字之前的0也会被忽略。
返回值
整形在
UInt8
,UInt16
,UInt32
,或者UInt64
的数据类型。函数使用rounding towards zero原则,这意味着会截断丢弃小数部分的数值。
对于负数和NaN and Inf来说转换的结果是不确定的。如果你传入一个负数,比如:
'-32'
,ClickHouse会抛出异常。具体使用的时候,请参考数值类型转换常见的问题。 -
toString
这些函数用于在数字、字符串(不包含FixedString)、Date以及DateTime之间互相转换。所有的函数都接受一个参数。
当将其他类型转换到字符串或从字符串转换到其他类型时,使用与TabSeparated格式相同的规则对字符串的值进行格式化或解析。如果无法解析字符串则抛出异常并取消查询。
当将Date转换为数字或反之,Date对应Unix时间戳的天数。将DataTime转换为数字或反之,DateTime对应Unix时间戳的秒数。
-
toDecimal(32|64|128)
-
-
字符串函数