Clickhouse 常用函数总结
1. 算术函数
算术运算符适用于 UInt8,UInt16,UInt32,UInt64,Int8,Int16,Int32,Int64,Float32,Float64 等类型。
- plus(a, b), a + b
- 计算数值的总和,也可将日期与整数进行相加;
- 在 Date 的情况下,和整数相加意味着添加相应的天数;
- 在 DateTime 的情况下,和整数相加意味着添加相应的秒数。
- minus(a, b), a - b
- 计算数值之间的差,也可将日期与整数进行相减,同
plus
一样。
- 计算数值之间的差,也可将日期与整数进行相减,同
- multiply(a, b), a * b
- 计算数值的乘积。
- divide(a, b), a / b
- 计算数值的商,结果类型是浮点类型;
- 当除以 0 时,结果为
inf
,-inf
或nan
。
- intDiv(a, b)
- 计算数值的商;
- 如果结果是正数,则向下取整;
- 如果结果是负数,则向上取整;
- 如果除数是 0 或用最小除数(
-9223372036854775808
)除以 -1 时,则抛异常。
- intDivOrZero(a, b)
- 用法与
intDiv
相同; - 区别在于它在除以零或将最小负数除以 -1 时返回零。
- 用法与
- modulo(a, b), a % b
- 计算除法后的余数;
- 如果类型是整数,则结果类型也是整数;
- 如果其中一个参数是浮点数,则结果类型也是浮点数;
- 除以 0 或将最小负数除以 -1 时抛出异常。
- moduloOrZero(a, b)
- 用法与
modulo
相同; - 区别在于它在除以零或将最小负数除以 -1 时返回零。
- 用法与
- negate(a), -a
- 计算数值的相反数。
- abs(a)
- 计算数值的绝对值;
- 对于无符号类型,它不执行任何操作(个人觉得这句话是废话,感兴趣的可以自己去测试下无符号类型
toUInt8(-257)
); - 对于有符号整数类型,它返回无符号数。
- gcd(a, b)
- 计算两个值的最大公约数;
- 其中一个值为 0 时抛出异常。
- lcm(a, b)
- 计算两个值的最小公倍数;
- 其中一个值为 0 时抛出异常。
- max2(a, b)
- 比较两个值并返回最大值,返回值为
Float64
类型。
- 比较两个值并返回最大值,返回值为
- min2(a, b)
- 比较两个值并返回最小值,返回值为
Float64
类型。
- 比较两个值并返回最小值,返回值为
2. 比较运算
比较运算符始终返回 0 或 1 (UInt8)。
可以比较以下几种类型:
- 数字
- String 和 FixedString
- 日期
- 日期时间
以上每组内的类型均可互相比较,但是不同组的类型间不能进行比较。
- equals(a, b),a = b,a == b
- 等于
- notEquals(a, b),a != b,a <> b
- 不等于
- less(a, b),a < b
- 小于
- greater(a, b),a > b
- 大于
- lessOrEquals(a, b),a <= b
- 小于等于
- greaterOrEquals(a, b),a >= b
- 大于等于
3. 逻辑函数
逻辑函数可以接受任何数字类型的参数,并返回UInt8
类型的 0 或 1。
当向函数传递 0 时,函数将判定为false
,任何其他非 0 的值都将被判定为true
。
- and(a, b, …),a AND b AND …
- 与,计算两个或多个值之间的逻辑与结果,如果有条件为 0,则结果为 0,如果有条件为
NULL
,则结果为NULL
。
- 与,计算两个或多个值之间的逻辑与结果,如果有条件为 0,则结果为 0,如果有条件为
- or(a, b, …),a OR b OR …
- 或,计算两个或多个值之间的逻辑或结果。如果有条件为 1,则结果为 1,如果有条件为
NULL
,则结果为NULL
。
- 或,计算两个或多个值之间的逻辑或结果。如果有条件为 1,则结果为 1,如果有条件为
- not(a)
- 非,值为 0 时返回 1,值为非 0 时返回 0,值为
NULL
时返回NULL
。
- 非,值为 0 时返回 1,值为非 0 时返回 0,值为
- xor(a, b, …)
- 异或。
4. 数组函数
- empty()
- 检测输入的数组是否为空,空数组返回 1,非空数组返回 0。
- notEmpty()
- 检测输入的数组是否非空,空数组返回 0,非空数组返回 1。
- length()
- 返回数组中的元素个数,结果类型是
UInt64
,该函数也适用于字符串。
- 返回数组中的元素个数,结果类型是
- range(end),range(start, end, step)
- 返回一个以
step
作为增量步长的从start
到end-1
的整形数字数组; - 所有参数 start、end、step 必须属于以下几种类型之一:UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64。
- 返回一个以
- array(x1, x2, …)
- 使用函数的参数作为数组元素创建一个数组;
- 参数必须是常量,并且具有最小公共类型的类型。
- arrayConcat(arr1, arr2, …)
- 合并参数中传递的所有数组。
- arrayElement(arr, n),arr[n]
- 获取数组
arr
中索引为n
的元素,n
必须是整数类型; - 如果索引超出数组的长度,则返回默认值(数字为 0,字符串为空字符串)。
- 获取数组
- has(arr, elem)
- 判断数组
arr
中是否存在元素elem
,如果存在,则返回 1,不存在返回 0。
- 判断数组
- hasAll(arr1, arr2)
- 判断
arr2
是否是arr1
的子集,如果是返回 1,不是返回 0; - 空数组是任何数组的子集,
NULL
在数组中作为元素值进行处理。
- 判断
- hasAny(arr1, arr2)
- 判断两个数组是否存在交集,如果存在返回 1,不存在返回 0。
- hasSubstr(arr1, arr2)
- 判断
arr2
的所有元素是否以相同的顺序存在于arr1
中,如果存在返回 1,不存在返回 0。
- 判断
- indexOf(arr, x)
- 返回数组中第一个
x
元素的索引(从 1 开始计算),如果x
不存在该数组中则返回 0。
- 返回数组中第一个
- countEqual(arr, x)
- 返回数组中等于
x
元素的个数。
- 返回数组中等于
- arrayEnumerate(arr)
- 返回数组元素下标,如:
Array[1,2,3,...,length(arr)]
。
- 返回数组元素下标,如:
- arrayEnumerateUniq(arr1, arr2, …)
- 返回与数组大小相同的数组,其中每个元素表示与其下标对应的原数组元素在原数组中出现的次数。如:
arrayEnumerateUniq([10,20,10,30]) = [1,1,2,1]
; - 也适用于参数大小相同的多个数组,这种情况下,对参数中所有数组的相同位置的元素进行统计次数,如:
1
2
3
4
5
6
7
8SELECT
arrayEnumerateUniq(
['1','2','3','1','4','1'],
['2','3','4','2','3','2'],
['2','3','4','3','3','2']
)
[1,1,1,1,1,2]
- 返回与数组大小相同的数组,其中每个元素表示与其下标对应的原数组元素在原数组中出现的次数。如:
- arrayPopBack(arr)
- 删除数组的最后一项。
- arrayPopFront(arr)
- 删除数组的第一项。
- arrayPushBack(arr, x)
- 将元素
x
添加到数组的末尾; - 只能将数字添加到数字类型的数组中,字符串添加到字符串数组中。
- 将元素
- arrayPushFront(arr, x)
- 将元素
x
添加到数组的开头; - 只能将数字添加到数字类型的数组中,字符串添加到字符串数组中。
- 将元素
- arrayResize(arr, size[, extender])
- 更改数组的长度,将数组更改成长度为
size
的数组; - 如果
size
小于数组的原大小,则数组从右侧截断; - 如果
size
大于数组的原大小,则使用extender
值或数组项的数据类型的默认值将数组扩展到右侧。
- 更改数组的长度,将数组更改成长度为
- arraySlice(arr, offset[, length])
- 返回一个子数组,包含从指定位置的指定长度的元素;
offset
表示数组的偏移。正值表示左侧的偏移量,负值表示右侧的缩进量,下标从 1 开始计算;length
表示子数组的长度,如果指定负值,则该函数返回[offset,array_length-length]
,如果省略该值,则该函数返回[offset,the_end_of_array]
。- 示例:
1
2
3
4
5SELECT
arraySlice([1,2,3,4,5,6], -1) # [6]
SELECT
arraySlice([1, 2, NULL, 4, 5], 2, 3) # [2,NULL,4]
- arraySort([func,] arr, …)
- 对数组
arr
进行升序排序,如果指定了func
函数,则排序顺序由func
函数的调用结果决定。如果func
接受多个参数,那么arraySort
函数也将解析与func
函数参数相同数量的数组参数。 NULL
,NaN
和Inf
的排序顺序:1
2
3
4SELECT
arraySort([1, nan, 2, NULL, 3, nan, -4, NULL, inf, -inf])
[-inf,-4,1,2,3,inf,nan,nan,NULL,NULL]arraySort
是高阶函数,可以将lambda
函数作为第一个参数传递给它。在这种情况下,排序顺序由lambda
函数的调用结果决定,示例:对于原数组的每个元素,1
2
3
4SELECT
arraySort((x) -> -x, [1, 2, 3])
[3,2,1]lambda
函数返回排序键,即[1 -> -1, 2 -> -2, 3 -> -3]
。由于arraySort
函数按升序对键进行排序,因此结果为[3,2,1]
。所以,(x) -> -x
lambda
函数将排序设置为降序。
lambda
函数可以接受多个参数。在这种情况下,需要为arraySort
传递与lambda
参数个数相同的数组。函数使用第一个输入的数组中的元素组成返回结果,使用接下来传入的数组作为排序键。示例:这里,在第二个数组1
2
3
4SELECT
arraySort((x, y) -> y, ['hello', 'world'], [2, 1])
["world","hello"][2, 1]
中定义了第一个数组['hello','world']
的相应元素的排序键,即['hello' -> 2,'world' -> 1]
。 由于lambda
函数中没有使用x
,因此源数组中的实际值不会影响结果的顺序。所以,'world'
将是结果中的第一个元素,'hello'
将是结果中的第二个元素。其他示例:1
2
3
4
5SELECT
arraySort((x, y) -> y, [0, 1, 2], ['c', 'b', 'a']) # [2,1,0]
SELECT
arraySort((x, y) -> - y, [0, 1, 2], [1, 2, 3]) # [2,1,0]
- 对数组
- arrayReverseSort([func,] arr, …)
- 以降序对
arr
数组的元素进行排序。如果指定了func
函数,则排序顺序由func
函数的调用结果决定。如果func
接受多个参数,那么arrayReverseSort
函数也将解析与func
函数参数相同数量的数组作为参数。具体用法同arraySort
一样。
- 以降序对
- arrayUniq(arr, …)
- 如果传递一个参数,则计算数组中不同元素的数量,如果传递了多个参数,则它计算多个数组中相应位置的不同元素元组的数量;
- 如果要获取数组中唯一项的列表,可以使用
arrayReduce('groupUniqArray',arr)
。
- arrayJoin(arr)
- 行转列,对数组进行展开操作。示例:
1
2
3
4
5
6SELECT
arrayJoin([1,2,3])
1
2
3
- 行转列,对数组进行展开操作。示例:
- arrayDifference(arr)
- 计算相邻数组元素之间的差异。返回一个数组,其中第一个元素为
0
,第二个是arr[1]-arr[0]
之差等。返回的数组中元素的类型由减法的类型推断规则确定(例如UInt8-UInt8=Int16
)。示例:1
2
3
4SELECT
arrayDifference([1, 3, 9, -3])
[0,2,6,-12]
- 计算相邻数组元素之间的差异。返回一个数组,其中第一个元素为
- arrayDistinct(arr)
- 返回一个包含所有数组中不同元素的数组。示例:
1
2
3
4SELECT
arrayDistinct([1, 2, 2, 3, 1])
[1,2,3]
- 返回一个包含所有数组中不同元素的数组。示例:
- arrayEnumerateDense(arr)
- 返回与源数组大小相同的数组,指示每个元素首次出现在源数组中的位置。示例:
1
2
3
4SELECT
arrayEnumerateDense([10, 20, 10, 30])
[1,2,1,3]
- 返回与源数组大小相同的数组,指示每个元素首次出现在源数组中的位置。示例:
- arrayIntersect(arr, …)
- 返回所有数组元素的交集。示例:
1
2
3
4SELECT
arrayIntersect([1, 2], [1, 3], [1, 4])
[1]
- 返回所有数组元素的交集。示例:
- arrayReduce(agg_func, arr1, arr2, …, arrN)
- 将聚合函数应用于数组元素并返回其结果。聚合函数的名称以单引号
'max'
、'sum'
中的字符串形式传递,使用带参数的聚合函数时,参数在括号中的函数名称后写明,如:'uniqUpTo(6)'
。1
2
3
4
5
6
7
8SELECT
arrayReduce('max', [1, 2, 3]) # 3
SELECT
arrayReduce('maxIf', [3, 5], [1, 0]) # 3
SELECT
arrayReduce('uniqUpTo(3)', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) # 4
- 将聚合函数应用于数组元素并返回其结果。聚合函数的名称以单引号
- arrayReduceInRanges(agg_func, ranges, arr1, arr2, …, arrN)
- 将聚合函数应用于给定范围内的数组元素,并返回一个包含与每个范围对应的结果的数组。该函数将返回与多个
arrayReduce(agg_func,arraySlice(arr1,index,length),...)
相同的结果; ranges
指要聚合的范围应该是元组为元素的数组,其中包含每个索引和长度范围,示例:1
2
3
4
5
6
7
8SELECT
arrayReduceInRanges(
'sum',
[(1, 5), (2, 3), (3, 4), (4, 4)],
[1000000, 200000, 30000, 4000, 500, 60, 7]
)
[1234500,234000,34560,4567]
- 将聚合函数应用于给定范围内的数组元素,并返回一个包含与每个范围对应的结果的数组。该函数将返回与多个
- arrayReverse(arr)
- 返回一个与原始数组大小相同、元素相反的数组,示例:
1
2
3
4SELECT
arrayReverse([1, 2, 3])
[3,2,1]
- 返回一个与原始数组大小相同、元素相反的数组,示例:
- arrayFlatten(arr, …)
- 将嵌套的数组展平,适用于任何深度的嵌套数组,不会更改已经展平的数组,示例:
1
2
3
4SELECT
flatten([[[1]], [[2], [3]]])
[1,2,3]
- 将嵌套的数组展平,适用于任何深度的嵌套数组,不会更改已经展平的数组,示例:
- arrayCompact(arr)
- 从数组中删除连续的重复元素。结果值的顺序由源数组中的顺序决定,示例:
1
2
3
4SELECT
arrayCompact([1, 1, nan, nan, 2, 3, 3, 3])
[1,nan,2,3]
- 从数组中删除连续的重复元素。结果值的顺序由源数组中的顺序决定,示例:
- arrayZip(arr1, arr2, …, arrN)
- 将多个数组组合成一个数组,返回一个将原数组中的元素分组为元组的数组。元组中的数据类型与输入数组的类型相同,并且与传递数组的顺序相同,示例:
1
2
3
4SELECT
arrayZip(['a', 'b', 'c'], [5, 2, 1])
[('a',5),('b',2),('c',1)]
- 将多个数组组合成一个数组,返回一个将原数组中的元素分组为元组的数组。元组中的数据类型与输入数组的类型相同,并且与传递数组的顺序相同,示例:
- arrayMap(func, arr1, …)
- 将从
func
函数的原始应用中获得的数组返回给arr
数组中的每个元素,示例:1
2
3
4SELECT
arrayMap(x -> (x + 2), [1, 2, 3])
[3,4,5]1
2
3
4
5
6
7
8
9SELECT
arrayMap(
(x, y, z) -> (x, y, z),
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
)
[(1,4,7),(2,5,8),(3,6,9)]
- 将从
- arrayFilter(func, arr1, …)
- 返回一个仅包含
arr1
中的元素的数组,其中func
返回的值不是 0,示例:1
2
3
4SELECT
arrayFilter(x -> x LIKE '%World%', ['Hello', 'abc World'])
['abc World']1
2
3
4
5
6
7
8SELECT
arrayFilter(
(i, x) -> x LIKE '%World%',
arrayEnumerate(arr),
['Hello', 'abc World'] AS arr
)
[2]
- 返回一个仅包含
- arrayFill(func, arr1, …)
- 从第一个元素到最后一个元素扫描
arr1
,如果func
返回 0,则用arr1[i-1]
替换arr1[i]
。arr1
的第一个元素不会被替换,示例:1
2
3
4
5
6
7SELECT
arrayFill(
x -> not isNull(x),
[1, null, 3, 11, 12, null, null, 5, 6, 14, null, null]
)
[1,1,3,11,12,12,12,5,6,14,14,14]
- 从第一个元素到最后一个元素扫描
- arrayReverseFill(func, arr1, …)
- 从最后一个元素到第一个元素扫描
arr1
,如果func
返回 0,则用arr1[i+1]
替换arr1[i]
。arr1
的最后一个元素不会被替换,示例:1
2
3
4
5
6
7SELECT
arrayReverseFill(
x -> not isNull(x),
[1, null, 3, 11, 12, null, null, 5, 6, 14, null, null]
)
[1,3,3,11,12,5,5,5,6,14,NULL,NULL]
- 从最后一个元素到第一个元素扫描
- arraySplit(func, arr1, …)
- 将
arr1
拆分为多个数组。当func
返回 0 以外的值时,数组将在元素的左侧拆分。数组不会在第一个元素之前被拆分,示例:1
2
3
4SELECT
arraySplit((x, y) -> y, [1, 2, 3, 4, 5], [1, 0, 0, 1, 0])
[[1,2,3],[4,5]]
- 将
- arrayReverseSplit(func, arr1, …)
- 将
arr1
拆分为多个数组。当func
返回 0 以外的值时,数组将在元素的右侧拆分,数组不会在最后一个元素之后被拆分。1
2
3
4SELECT
arrayReverseSplit((x, y) -> y, [1, 2, 3, 4, 5], [1, 0, 0, 1, 0])
[[1],[2,3,4],[5]]
- 将
- arrayMin([func,] arr)
- 返回数组中最小的元素,示例:
1
2
3
4
5SELECT
arrayMin([1, 2, 4]) # 1
SELECT
arrayMin(x -> (- x), [1, 2, 4]) # -4
- 返回数组中最小的元素,示例:
- arrayMax([func,] arr)
- 返回数组中最大的元素,示例:
1
2
3
4
5SELECT
arrayMax([1, 2, 4]) # 4
SELECT
arrayMax(x -> (- x), [1, 2, 4]) # -1
- 返回数组中最大的元素,示例:
- arraySum([func,] arr)
- 返回数组中元素的总和,示例:
1
2
3
4
5SELECT
arraySum([2, 3]) # 5
SELECT
arraySum(x -> x * x, [2, 3]) # 13
- 返回数组中元素的总和,示例:
- arrayAvg([func,] arr)
- 返回数组中元素的平均值,示例:
1
2
3
4
5SELECT
arrayAvg([1, 2, 4]) # 2.3333333333333335
SELECT
arrayAvg(x -> (x * x), [2, 4]) # 10
- 返回数组中元素的平均值,示例:
- arrayCumSum([func,] arr1, …)
- 返回源数组中元素的部分和的数组(运行总和)。如果指定了
func
函数,则数组元素的值在求和之前由该函数转换,示例:1
2
3
4SELECT
arrayCumSum([1, 2, 1, 8])
[1,3,4,12]
- 返回源数组中元素的部分和的数组(运行总和)。如果指定了
- arrayCumSumNonNegative(arr)
- 与
arrayCumSum
相同,返回数组中元素的部分和的数组(运行总和),区别是当返回值包含小于零的值时,将该值替换为零,并以零参数执行后续计算。示例:1
2
3
4SELECT
arrayCumSumNonNegative([1, 1, -4, 1])
[1,2,0,1]
- 与
- arrayProduct(arr)
- 将一个数组中的元素相乘。示例:
1
2
3
4SELECT
arrayProduct([1,2,3,4,5,6])
720
- 将一个数组中的元素相乘。示例:
5. 时间日期函数
- timeZone()
- 返回服务器的时区。 如果它在分布式表的上下文中执行,那么它会生成一个普通列,其中包含与每个分片相关的值。否则它会产生一个常数值。
- toTimeZone(value, timezone)
- 将
Date
或DateTime
转换为指定的时区。 时区是Date/DateTime
类型的属性。 表字段或结果集的列的内部值(秒数)不会更改,列的类型会更改,并且其字符串表示形式也会相应更改。
- 将
- timeZoneOf(value)
- 返回
DateTime
或者DateTime64
数据类型的时区名称。value
指类型和时间,类型为DateTime
或者DateTime64
。
- 返回
- toYear
- 将
Date
或DateTime
转换为包含年份编号(AD)的UInt16
类型的数字。
- 将
- toQuarter
- 将
Date
或DateTime
转换为包含季度编号的UInt8
类型的数字。
- 将
- toMonth
- 将
Date
或DateTime
转换为包含月份编号(1-12)的UInt8
类型的数字。
- 将
- toDayOfYear
- 将
Date
或DateTime
转换为包含一年中的某一天编号的UInt16
(1-366)类型的数字。
- 将
- toDayOfMonth
- 将
Date
或DateTime
转换为包含一月中的某一天编号的UInt8
(1-31)类型的数字。
- 将
- toDayOfWeek
- 将
Date
或DateTime
转换为包含一周中的某一天编号的UInt8
(周一是 1,周日是 7)类型的数字。
- 将
- toHour
- 将
DateTime
转换为包含 24 小时制(0-23)小时数的UInt8
数字。
- 将
- toMinute
- 将
DateTime
转换为包含一小时中分钟数(0-59)的UInt8
数字。
- 将
- toSecond
- 将
DateTime
转换为包含一分钟中秒数(0-59)的UInt8
数字, 闰秒不计算在内。
- 将
- toUnixTimestamp
toUnixTimestamp(datetime)
:将值转换为UInt32
类型的 Unix 时间戳数字;toUnixTimestamp(str, [timezone])
:根据时区将输入字符串转换为日期时间,并返回相应的 Unix 时间戳。
- toStartOfYear
- 将
Date
或DateTime
向前取整到本年的第一天, 返回Date
类型。
- 将
- toStartOfISOYear
- 将
Date
或DateTime
向前取整到 ISO 本年的第一天, 返回Date
类型。
- 将
- toStartOfQuarter
- 将
Date
或DateTime
向前取整到本季度的第一天, 返回Date
类型。
- 将
- toStartOfMonth
- 将
Date
或DateTime
向前取整到本月的第一天, 返回Date
类型。
- 将
- toMonday
- 将
Date
或DateTime
向前取整到本周的星期一, 返回Date
类型。
- 将
- toStartOfWeek(t [, mode])
- 按
mode
将Date
或DateTime
向前取整到最近的星期日或星期一,返回Date
类型。mode
参数的工作方式与toWeek()
的mode
参数完全相同,mode
默认为 0。
- 按
- toStartOfDay
- 将
DateTime
向前取整到今天的开始。
- 将
- toStartOfHour
- 将
DateTime
向前取整到当前小时的开始。
- 将
- toStartOfMinute
- 将
DateTime
向前取整到当前分钟的开始。
- 将
- toStartOfSecond(value [, timezone])
- 将
DateTime
向前取整到当前秒数的开始。
- 将
- toStartOfFiveMinutes
- 将
DateTime
以五分钟为单位向前取整到最接近的时间点。
- 将
- toStartOfFifteenMinutes
- 将
DateTime
以十五分钟为单位向前取整到最接近的时间点。
- 将
- toStartOfInterval(time_or_data, 间隔x单位 [, time_zone])
- 这是名为
toStartOf*
的所有函数的通用函数。 toStartOfInterval(t, INTERVAL 1 year)
返回与toStartOfYear(t)
相同的结果;toStartOfInterval(t, INTERVAL 1 month)
返回与toStartOfMonth(t)
相同的结果;toStartOfInterval(t, INTERVAL 1 day)
返回与toStartOfDay(t)
相同的结果;toStartOfInterval(t, INTERVAL 15 minute)
返回与toStartOfFifteenMinutes(t)
相同的结果。
- 这是名为
- toTime
- 将
DateTime
中的日期转换为一个固定的日期,同时保留时间部分。
- 将
- toRelativeYearNum
- 将
Date
或DateTime
转换为年份的编号,从过去的某个固定时间点开始。
- 将
- toRelativeQuarterNum
- 将
Date
或DateTime
转换为季度的数字,从过去的某个固定时间点开始。
- 将
- toRelativeMonthNum
- 将
Date
或DateTime
转换为月份的编号,从过去的某个固定时间点开始。
- 将
- toRelativeWeekNum
- 将
Date
或DateTime
转换为星期数,从过去的某个固定时间点开始。
- 将
- toRelativeDayNum
- 将
Date
或DateTime
转换为当天的编号,从过去的某个固定时间点开始。
- 将
- toRelativeHourNum
- 将
DateTime
转换为小时数,从过去的某个固定时间点开始。
- 将
- toRelativeMinuteNum
- 将
DateTime
转换为分钟数,从过去的某个固定时间点开始。
- 将
- toRelativeSecondNum
- 将
DateTime
转换为秒数,从过去的某个固定时间点开始。
- 将
- toISOYear
- 将
Date
或DateTime
转换为包含 ISO 年份的UInt16
类型的编号。
- 将
- toISOWeek
- 将
Date
或DateTime
转换为包含 ISO 周数的UInt8
类型的编号。
- 将
- toWeek(date [, mode][, Timezone])
-
返回
Date
或DateTime
的周数。两个参数形式可以指定星期是从星期日还是星期一开始,以及返回值应在 0 到 53 还是从 1 到 53 的范围内。如果省略了mode
参数,则默认值为 0。toISOWeek()
是一个兼容函数,等效于toWeek(date,3)
。 -
如果包含 1 月 1 日的一周在后一年度中有 4 天或更多天,则为第 1 周,否则它是上一年的最后一周,下周是第 1 周。
-
下表是
mode
参数的工作方式:Mode First day of week Range Week 1 is the first week … 0 Sunday 0 - 53 with a Sunday in this year 1 Monday 0 - 53 with 4 or more days this year 2 Sunday 1 - 53 with a Sunday in this year 3 Monday 1 - 53 with 4 or more days this year 4 Sunday 0 - 53 with 4 or more days this year 5 Monday 0 - 53 with a Monday in this year 6 Sunday 1 - 53 with 4 or more days this year 7 Monday 1 - 53 with a Monday in this year 8 Sunday 1 - 53 contains January 1 9 Monday 1 - 53 contains January 1
-
- toYearWeek(date [, mode])
- 返回
Date
的年和周。 结果中的年份可能因为Date
为该年份的第一周和最后一周导致Date
的年份不同。mode
参数的工作方式与toWeek()
的mode
参数完全相同,默认为 0; toISOYear()
是一个兼容函数,等效于intDiv(toYearWeek(date,3),100)
。
- 返回
- date_trunc(unit, value [, timezone])
- 将
Date
或DateTime
按指定的单位向前取整到最接近的时间点; unit
可选值:second、minute、hour、day、week、month、quarter、year。
- 将
- date_add(unit, value, date)
- 将时间间隔或日期间隔添加到提供的日期或带时间的日期。
unit
同date_trunc()
一样,对应value
的时间单位,示例:1
2
3
4SELECT
date_add(YEAR, 3, toDate('2018-01-01'))
2021-01-01
- date_diff(‘unit’, startdate, enddate, [timezone])
- 返回两个日期或具有时间值的日期之间的差值;
unit
对应value
的时间单位,类型为String
,可选值:microsecond、millisecond、second、minute、hour、day、week、month、quarter、year。
- date_sub(unit, value, date)
- 从提供的日期或带时间的日期中减去时间间隔或日期间隔;
unit
同date_trunc()
一样,对应value
的时间单位,示例:1
2
3
4SELECT
date_sub(YEAR, 3, toDate('2018-01-01'))
2015-01-01
- timestamp_add(date, INTERVAL value unit)
- 将指定的时间值与提供的日期或日期时间值相加;
unit
同date_trunc()
一样,对应value
的时间单位,类型为String
,示例:1
2
3
4select
timestamp_add(toDate('2018-01-01'), INTERVAL 3 MONTH)
2018-04-01
- timestamp_sub(unit, value, date)
- 从提供的日期或带时间的日期中减去时间间隔;
unit
同date_trunc()
一样,对应value
的时间单位,类型为String
,示例:1
2
3
4select
timestamp_sub(MONTH, 5, toDateTime('2018-12-18 01:02:03'))
2018-07-18 01:02:03
- now([timezone])
- 返回当前日期和时间,可选参数
timezone
指定时区。
- 返回当前日期和时间,可选参数
- today
- 不接受任何参数并在请求执行时的某一刻返回当前日期(Date), 其功能与
toDate(now())
相同。
- 不接受任何参数并在请求执行时的某一刻返回当前日期(Date), 其功能与
- yesterday
- 不接受任何参数并在请求执行时的某一刻返回昨天日期(Date), 其功能与
today()-1
相同。
- 不接受任何参数并在请求执行时的某一刻返回昨天日期(Date), 其功能与
- toYYYYMM
- 将
Date
或DateTime
转换为包含年份和月份编号的UInt32
类型的数字(YYYY*100+MM
)。
- 将
- toYYYYMMDD
- 将
Date
或DateTime
转换为包含年份和月份编号的UInt32
类型的数字(YYYY*10000+MM*100+DD
)。
- 将
- toYYYYMMDDhhmmss
- 将
Date
或DateTime
转换为包含年份和月份编号的UInt64
类型的数字(YYYY*10000000000+MM*100000000+DD*1000000+hh*10000+mm*100+ss
)。
- 将
- addYears, addMonths, addWeeks, addDays, addHours, addMinutes, addSeconds, addQuarters
- 函数将一段时间间隔添加到
Date/DateTime
,然后返回Date/DateTime
,示例:1
2
3
4
5
6
7
8
9
10WITH
toDate('2018-01-01') AS date,
toDateTime('2018-01-01 00:00:00') AS date_time
SELECT
addYears(date, 1) AS add_years_with_date,
addYears(date_time, 1) AS add_years_with_date_time
┌─add_years_with_date─┬─add_years_with_date_time─┐
│ 2019-01-01 │ 2019-01-01 00:00:00 │
└─────────────────────┴──────────────────────────┘
- 函数将一段时间间隔添加到
- subtractYears,subtractMonths,subtractWeeks,subtractDays,subtractours,subtractMinutes,subtractSeconds,subtractQuarters
- 函数将
Date/DateTime
减去一段时间间隔,然后返回Date/DateTime
,示例:1
2
3
4
5
6
7
8
9
10WITH
toDate('2019-01-01') AS date,
toDateTime('2019-01-01 00:00:00') AS date_time
SELECT
subtractYears(date, 1) AS subtract_years_with_date,
subtractYears(date_time, 1) AS subtract_years_with_date_time
┌─subtract_years_with_date─┬─subtract_years_with_date_time─┐
│ 2018-01-01 │ 2018-01-01 00:00:00 │
└──────────────────────────┴───────────────────────────────┘
- 函数将
- timeSlots(StartTime, Duration,[, Size])
- 它返回一个时间数组,其中包括从从
StartTime
开始到StartTime+Duration
秒内的所有符合size
(以秒为单位)步长的时间点。其中size
是一个可选参数,默认为 1800。 例如,timeSlots(toDateTime('2012-01-01 12:20:00'), 600) = [toDateTime('2012-01-01 12:00:00'), toDateTime('2012-01-01 12:30:00')]
,这对于搜索在相应会话中综合浏览量是非常有用的。
- 它返回一个时间数组,其中包括从从
- formatDateTime(Time, Format[, Timezone])
-
函数根据给定的格式字符串来格式化时间。格式字符串必须是常量表达式,例如:单个结果列不能有多种格式字符串。
-
支持的格式修饰符:
修饰符 描述 示例 %C 年除以100并截断为整数(00-99) 20 %d 月中的一天,零填充(01-31) 02 %D 短MM/DD/YY日期,相当于%m/%d/%y 01/02/2018 %e 月中的一天,空格填充( 1-31) 2 %F 短YYYY-MM-DD日期,相当于%Y-%m-%d 2018-01-02 %G ISO周号的四位数年份格式, 从基于周的年份由ISO 8601定义 标准计算得出,通常仅对%V有用 2018 %g 两位数的年份格式,与ISO 8601一致,四位数表示法的缩写 18 %H 24小时格式(00-23) 22 %I 12小时格式(01-12) 10 %j 一年中的一天 (001-366) 002 %m 月份为十进制数(01-12) 01 %M 分钟(00-59) 33 %n 换行符(") %p AM或PM指定 PM %Q 季度(1-4) 1 %R 24小时HH:MM时间,相当于%H:%M 22:33 %S 秒 (00-59) 44 %t 水平制表符(’) %T ISO8601时间格式(HH:MM:SS),相当于%H:%M:%S 22:33:44 %u ISO8601工作日为数字,星期一为1(1-7) 2 %V ISO8601周编号(01-53) 01 %w 工作日为十进制数,周日为0(0-6) 2 %y 年份,最后两位数字(00-99) 18 %Y 年 2018 %% %符号 % -
示例:
1
2
3
4SELECT
formatDateTime(toDate('2010-01-04'), '%g')
10
-
- dateName(date_part, date)
- 返回日期的指定部分;
date_part
类型为String
,可为 ‘year’, ‘quarter’, ‘month’, ‘week’, ‘dayofyear’, ‘day’, ‘weekday’, ‘hour’, ‘minute’, ‘second’;- 示例:
1
2
3
4
5
6
7
8
9WITH toDateTime('2021-04-14 11:22:33') AS date_value
SELECT
dateName('year', date_value),
dateName('month', date_value),
dateName('day', date_value)
┌─dateName('year', date_value)─┬─dateName('month', date_value)─┬─dateName('day', date_value)─┐
│ 2021 │ April │ 14 │
└──────────────────────────────┴───────────────────────────────┴─────────────────────────────
- FROM_UNIXTIME
- 当只有单个整数类型的参数时,它的作用与
toDateTime
相同,并返回DateTime
类型,示例:1
2
3
4SELECT
FROM_UNIXTIME(423543535)
1983-06-04 10:58:55 - 当有两个参数时,第一个是整型或
DateTime
,第二个是常量格式字符串,它的作用与formatDateTime
相同,并返回String
类型,示例:1
2
3
4SELECT
FROM_UNIXTIME(1234334543, '%Y-%m-%d %R:%S')
2009-02-11 14:42:23
- 当只有单个整数类型的参数时,它的作用与
6. 字典函数
- dictGetString(‘dict_name’, ‘attr_name’, id)
- 使用
id
键获取dict_name
字典中attr_name
属性的值。dict_name
和attr_name
是常量字符串。id
必须是UInt64
。 如果字典中没有id
键,则返回字典描述中指定的默认值。
- 使用
- dictGetTOrDefault(‘dict_name’, ‘attr_name’, id, default)
- 与
dictGetString()
函数相同,但默认值取自函数的最后一个参数。
- 与
- dictIsIn(‘dict_name’, child_id, ancestor_id)
- 对于
dict_name
分层字典,查找child_id
键是否位于ancestor_id
内(或匹配ancestor_id
)。返回UInt8
。
- 对于
- dictGetHierarchy(‘dict_name’, id)
- 对于
dict_name
分层字典,返回从id
开始并沿父元素链继续的字典键数组,返回 Array(UInt64)。
- 对于
- dictHas(‘dict_name’, id)
- 检查字典是否存在指定的
id
。如果不存在,则返回 0,如果存在,则返回 1。
- 检查字典是否存在指定的
7. Nullable处理函数
- isNull(x)
x
为一个非复合数据类型的值;- 如果为
NULL
返回 1,不为NULL
返回 0。
- isNotNull(x)
- 同
isNull()
函数作用相反。
- 同
- coalesce(x,…)
- 检查从左到右是否传递了
NULL
参数并返回第一个非NULL
参数; - 如果所有参数都是
NULL
则返回NULL
。
- 检查从左到右是否传递了
- ifNull(x,alt)
- 如果第一个参数为
NULL
,则返回第二个参数的值,否则返回第一个值。
- 如果第一个参数为
- nullIf(x, y)
- 如果参数相等,则返回
NULL
,x
和y
类型必须兼容,否则抛出异常; - 如果参数不相等,则返回
x
。
- 如果参数相等,则返回
- assumeNotNull(x)
- 将可为空类型的值转换为非
Nullable
类型的值; - 如果
x
不为NULL
,返回x
,如果x
为NULL
,则返回该类型的默认值。
- 将可为空类型的值转换为非
- toNullable(x)
- 将参数的类型转换为
Nullable
。
- 将参数的类型转换为
8. IP函数
- IPv4NumToString(num)
- 接受一个
UInt32
(大端)表示的IPv4
的地址,返回相应IPv4
的字符串表现形式,格式为A.B.C.D
(以点分割的十进制数字)。
- 接受一个
- IPv4StringToNum(s)
- 与
IPv4NumToString
函数相反。如果IPv4
地址格式无效,则返回 0。
- 与
- IPv4NumToStringClassC(num)
- 与
IPv4NumToString
类似,但使用xxx
替换最后一个字节。
- 与
- IPv6NumToString(x)
- 接受
FixedString(16)
类型的二进制格式的IPv6
地址。以文本格式返回此地址的字符串。IPv6
映射的IPv4
地址以::ffff:111.222.33
。例如:1
2
3
4SELECT
IPv6NumToString(toFixedString(unhex('2A0206B8000000000000000000000011'), 16)) AS addr
2a02:6b8::11
- 接受
- IPv6StringToNum(s)
- 与
IPv6NumToString
相反。如果IPv6
地址格式无效,则返回空字节字符串。 十六进制可以是大写的或小写的。
- 与
- IPv4ToIPv6(x)
- 接受一个
UInt32
类型的IPv4
地址,返回FixedString(16)
类型的IPv6
地址。例如:1
2
3
4SELECT
IPv6NumToString(IPv4ToIPv6(IPv4StringToNum('192.168.0.1'))) AS addr
::ffff:192.168.0.1
- 接受一个
- toIPv4(字符串)
IPv4StringToNum()
的别名,它采用字符串形式的IPv4
地址并返回IPv4
类型的值,该二进制值等于IPv4StringToNum()
返回的值。
- toIPv6(字符串)
IPv6StringToNum()
的别名,它采用字符串形式的IPv6
地址并返回IPv6
类型的值,该二进制值等于IPv6StringToNum()
返回的值。
9. 字符串拆分合并函数
- splitByChar(分隔符,s)
- 将字符串以
separator
拆分成多个子串。separator
必须为仅包含一个字符的字符串常量, 返回拆分后的子串的数组; - 如果分隔符出现在字符串的开头或结尾,或者如果有多个连续的分隔符,则将在对应位置填充空的子串。
- 将字符串以
- splitByString(分隔符,s)
- 与
splitByChar
相同,但它使用多个字符的字符串作为分隔符。 该字符串必须为非空。
- 与
- arrayStringConcat(arr[,分隔符])
- 使用
separator
将数组中列出的字符串拼接起来。separator
是一个可选参数:一个常量字符串,默认情况下设置为空字符串。 返回拼接后的字符串。
- 使用
- alphaTokens(s)
- 从范围
a-z
和A-Z
中选择连续字节的子字符串,返回子字符串数组; - 示例:
1
2
3
4SELECT
alphaTokens('abca1abc')
['abca','abc']
- 从范围
10. 字符串函数
- empty
- 对于空字符串返回 1,对于非空字符串返回 0。 结果类型是
UInt8
。 如果字符串包含至少一个字节,则该字符串被视为非空字符串,即使这是一个空格或空字符。 该函数也适用于数组。
- 对于空字符串返回 1,对于非空字符串返回 0。 结果类型是
- notEmpty
- 对于空字符串返回 0,对于非空字符串返回 1。 结果类型是
UInt8
。 该函数也适用于数组。
- 对于空字符串返回 0,对于非空字符串返回 1。 结果类型是
- length
- 返回字符串的字节长度。 结果类型是
UInt64
。 该函数也适用于数组。
- 返回字符串的字节长度。 结果类型是
- lower, lcase
- 将字符串中的
ASCII
转换为小写。
- 将字符串中的
- upper, ucase
- 将字符串中的
ASCII
转换为大写。
- 将字符串中的
- reverse
- 反转字符串。
- format(pattern, s0, s1, …)
- 使用常量字符串
pattern
格式化其他参数。pattern
字符串中包含由大括号{}
包围的替换字段。 未被包含在大括号中的任何内容都被视为文本内容,它将原样保留在返回值中。示例:1
2
3
4SELECT
format('{1} {0} {0}{1}{1}', 'World', 'Hello')
Hello World WorldHelloHello
- 使用常量字符串
- concat(s1, s2, …)
- 将参数中的多个字符串拼接,不带分隔符。
- substring(s,offset,length), mid(s,offset,length), substr(s,offset,length)
- 以字节为单位截取指定位置字符串,返回以
offset
位置为开头,长度为length
的子串。offset
从1开始(与标准 SQL 相同)。offset
和length
参数必须是常量。
- 以字节为单位截取指定位置字符串,返回以
- appendTrailingCharIfAbsent(s,c)
- 如果
s
字符串非空并且末尾不包含c
字符,则将c
字符附加到末尾。
- 如果
- endsWith(s,后缀)
- 返回是否以指定的后缀结尾。如果字符串以指定的后缀结束,则返回 1,否则返回 0。
- startsWith(s,前缀)
- 返回是否以指定的前缀开头。如果字符串以指定的前缀开头,则返回 1,否则返回 0。
- trimLeft(s)
- 返回一个字符串,用于删除左侧的空白字符。
- trimRight(s)
- 返回一个字符串,用于删除右侧的空白字符。
- trimBoth(s)
- 返回一个字符串,用于删除任一侧的空白字符。
11. 字符串替换函数
- replaceOne(haystack, pattern, replacement)
- 用
replacement
子串替换haystack
中第一次出现的pattern
子串(如果存在)。pattern
和replacement
必须是常量。
- 用
- replaceAll(haystack, pattern, replacement), replace(haystack, pattern, replacement)
- 用
replacement
子串替换haystack
中出现的所有的pattern
子串。
- 用
- replaceRegexpOne(haystack, pattern, replacement)
- 使用
pattern
正则表达式的替换。pattern
可以是任意一个有效的re2
正则表达式。 如果存在与pattern
正则表达式匹配的匹配项,仅替换第一个匹配项。 模式pattern
可以指定为replacement
。此模式可以包含替代\0-\9
。 替代\0
包含了整个正则表达式。替代\1-\9
对应于子模式编号。要在模板中使用反斜杠\
,请使用\
将其转义。 另外还请记住,字符串字面值(literal)需要额外的转义。 - 示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19SELECT DISTINCT
EventDate,
replaceRegexpOne(toString(EventDate), '(\\d{4})-(\\d{2})-(\\d{2})', '\\2/\\3/\\1') AS res
FROM test.hits
LIMIT 7
FORMAT TabSeparated
2014-03-17 03/17/2014
2014-03-18 03/18/2014
2014-03-19 03/19/2014
2014-03-20 03/20/2014
2014-03-21 03/21/2014
2014-03-22 03/22/2014
2014-03-23 03/23/2014
SELECT
replaceRegexpOne('Hello, World!', '.*', '\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0') AS res
Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!
- 使用
- replaceRegexpAll(haystack, pattern, replacement)
- 与
replaceRegexpOne
相同,但会替换所有出现的匹配项。例如:1
2
3
4SELECT
replaceRegexpAll('Hello, World!', '.', '\\0\\0') AS res
HHeelllloo,, WWoorrlldd!! - 另外,对于空子字符串,正则表达式只会进行一次替换。 示例:
1
2
3
4SELECT
replaceRegexpAll('Hello, World!', '^', 'here: ') AS res
here: Hello, World!
- 与
12. 聚合函数
- count
- min
- max
- sum
- avg
- any
- argMin(arg, val)
- 计算
val
最小值对应的arg
值。 如果val
最小值存在几个不同的arg
值,输出遇到的第一个arg
值; - 示例:
1
2
3
4
5
6
7
8
9
10
11
12┌─user─────┬─salary─┐
│ director │ 5000 │
│ manager │ 3000 │
│ worker │ 1000 │
└──────────┴────────┘
SELECT
argMin(user, salary), argMin(tuple(user, salary), salary) FROM salary;
┌─argMin(user, salary)─┬─argMin(tuple(user, salary), salary)─┐
│ worker │ ('worker',1000) │
└──────────────────────┴─────────────────────────────────────┘
- 计算
- argMax(arg, val)
- 计算
val
最大值对应的arg
值。 如果val
最大值存在几个不同的arg
值,输出遇到的第一个值。
- 计算
- groupArray(x)
- 列转行。
参考文献
此文章版权归 程序园 所有,如有转载,请注明来自原作者。
评论
ValineDisqus