clickhouse⼦查询_Clickhouse函数介绍
Clickhouse 中⾄少有2中类型的函数
-正常函数(被称为 functions)和聚合函数.
这两个函数完全不同。正常函数被应⽤到每⾏(对于每⾏,函数的结果不依赖与其他⾏).聚合函数从不同的⾏中累计相应的值(例如. 他们依赖整个⾏的集合). 在本章中,我们将讨论正常函数. 对于聚合函数, 查看章节"Aggregate functions". *
有第三种函数的类型, 'arrayJoin’函数属于; 表函数也能够被单独提及.
强类型
与标准的 SQL 不同, ClickHouse 有强类型. 换句话说, 它不能在类型之间进⾏隐式转换. 每个函数可以运⾏在不同数据类型之上. 这意味着有时你需要使⽤类型转换函数.
通⽤的⼦表达消除
在⼀个查询中所有的表达式都有相同的 AST (相同的记录或者相同的语法解析) 能够被考虑有完全相同的值. 这些表达式可以拼接的,⼀次执⾏. 相同的⼦查询也能够按照相同的⽅式消除.
结果类型
所有的函数返回⼀个单值作为结果 (不是多个值,也不是0值). 通常情况下,结果的类型仅通过参数的类型来定义, 不通过值来定义. 异常是tupleElement 函数 (a.N 操作符), 同时是 toFixedString 函数.
常量
为了简化, 某些函数的参数仅能带有常数⼯作. 例如, LIKE 操作符的右侧参数必须是⼀个常数. 对于常数参数, ⼏乎所有的函数返回⼀个常数.异常是⼀个函数,可⽣成随机数. 对于查询来说, ’now’ 函数返回不同的值,如果运⾏在不同的时间点上,但是结果是⼀个常数, 常数仅在⼀次查询内是重要的. ⼀个常数表达式也考虑到⼀个常数 (例如, LIKE 操作符右侧从多个常量中构建). 函数能够以不同的⽅式实现,可带有常数和⾮常数参数. 但是对于⼀个常数的结果,对于⼀个仅包含相同值的列应该互相匹配.
不可变性
对于这些参数, 函数不能改变值
-任何的改变作为结果返回. 因此, 计算不同的函数的结果不依赖哪个函数写到了查询中.
错误处理
⼀些函数可能抛出⼀些异常 如果数据是⽆效的. 在这种情况下, 查询被计算,错误⽂本将返回给客户端. 对于分布式处理,当⼀个异常在⼀个服务器中发⽣时, 其他服务器也放弃这个查询.
参数表达式赋值
在⼤多数编程语⾔中, 对于某些操作符⼀个参数可能并不被赋值. 通常情况下,对于操作符 &&, ||, ?:. 但是在 ClickHouse 中, 函数的参数(操作符) 通常是被赋值的. 这是因为列的整个部分被⼀次性赋值, ⽽不是单独计算每个⾏.
为分布式查询处理执⾏函数
对于分布式查询处理, 查询处理的多个阶段尽量执⾏在远程服务器上, 剩下的阶段被处理在请求服务器上 (合并中间结果和后续处理) . 这意味着函数能够被执⾏在不同的服务器上. 例如, 在查询中SELECTf(sum(g(x)))FROM distributed_table GROUP BYh(y),
-如果%%distributed_table%%有⾄少2个分⽚,此函数%%g%%和%%h%%在远程服务器上被执⾏,同时函数%%f%% -在请求服务器上执⾏.
如果 %%distributed_table%% 仅有⼀个分⽚, 所有的函数 %%f%%, %%g%%, 和 %%h%% 在这个分⽚服务器上执⾏. 函数的结果通常不依赖于哪个服务器执⾏. 然⽽, 优势这个⾮常重要的. 例如, 函数使
⽤词典, 词典存在于服务器内. 另外⼀个例⼦是 %%hostName%% 函数, 返回服务器的名称为了通过服务器进⾏GROUP BY汇总查询. 如果在查询中⼀个函数在请求服务器中被执⾏, 但是你需要在远程服务器上处理,你能够封装它到任意的聚合函数中或者添加到GROUP BY的⼀个 Key 中.
算术函数
对于所有的算术函数, 结果类型被计算作为适合结果的最⼩数字类型, 如果有这样⼀个类型. 最⼩值基于bits位数, 是否它被分配, 是否它是浮groupby是什么函数
点数. 如果没有⾜够的 bits 位数, 最⾼的 bit 类型被采纳. 例如:
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,or Float64。Overflow以C++的⽅式被
⽣成。
plus(a,b),a + b 操作符
计算数字的总和。你也可以添加带有Date或DateTime的整个数字。对于 Date 类型,添加⼀个整个数字意味着添加对应的天数。意味着添
加对应的秒数。
minus(a,b),a - b 操作符
计算不同.此结果通常是signed.你也能够从date或datetime类型上计算整个数字.想法是相同的-查看以上的’plus’.
multiply(a,b),a * b 操作符
计算数字相乘.
divide(a,b),a / b 操作符
计算数字相除. 结果类型经常是⼀个浮点类型. 不是整数相除. 对于整数相除, 使⽤ ‘intDiv’ 函数. 当除以0时,结果为 ‘inf’, ‘-inf’, 或
者’nan’.
intDiv(a,b)
计算商数. 除以整数, 四舍五⼊(通过绝对值). 当除以0或最⼩负整数时,抛出异常.
计算数字的商。
intDivOrZero(a,b)
不同于 ‘intDiv’ ,它将返回0,当除以0或当除以⼀个最⼩负整数时.
modulo(a,b),a % b操作符
在相除之后计算剩余数. 如果参数是浮点数, 它们先转换为整数,通过去除浮点精度部分. 剩余数与C++处理⽅式相同. 截断相除⽤于负数. ⼀
个异常将要抛出,当除以0或者当除以最⼩负数.
negate(a),-a 操作符
计算⼀个带有反符号的数字. 结果经常带有符号.
abs(a)操作符
计算⼀个数的绝对值’a’. 如果 a< 0, 它将返回 -a. 对于⾮符号类型, 什么都不做. 对于符号整型类型, 将返回⾮符号数字.
gcd(a, b)操作符
返回数字最通⽤的除数. 当除以0或当除以最⼩负数后,异常将抛出.
lcm(a, b)
返回最通⽤的乘数. 当除以0或当除以最⼩负数后,异常将抛出.
Bit 函数
Bit函数服务于UInt8,UInt16,UInt32,UInt64,Int8,Int16,Int32,Int64,Float32,或者Float64.结果类型是⼀个带有位数的整型,与参数的最⼤位数相等.如果⾄少有⼀个参数被指定,结果将是⼀个符号化数字.如果⼀个参数是⼀个浮点数,它将转换到Int64.
为数组服务的函数
empty
为空数组返回1,对于⾮空数组返回0。结果类型是UInt8。该函数也适⽤于字符串。
notEmpty
对于空数组返回0,对于⾮空数组返回1。结果类型是UInt8。该函数也适⽤于字符串。
length
返回数组中的项⽬数。结果类型是UInt64。该函数也适⽤于字符串。
emptyArrayUInt8, emptyArrayUInt16, emptyArrayUInt32, emptyArrayUInt64
emptyArrayInt8, emptyArrayInt16, emptyArrayInt32, emptyArrayInt64
emptyArrayFloat32, emptyArrayFloat64
emptyArrayDate, emptyArrayDateTime
emptyArrayString
接受零参数并返回相应类型的空数组。
emptyArrayToSingle
接受⼀个空数组并返回⼀个等于默认值的⼀个元素的数组。
range(N)
返回从0到N-1的数字数组。以防万⼀,如果在数据块中创建总长度超过100,000,000个元素的数组,则会引发异常。
array(x1, …), оператор [x1, …]
从函数参数创建⼀个数组。参数必须是常量,并且具有最⼩通⽤类型的类型。必须⾄少传递⼀个参数,否则不清楚创建哪种类型的数组。也就是说,你不能使⽤这个函数来创建⼀个空数组(为此,使⽤
上⾯描述的’emptyArray *'函数)。返回⼀个“Array(T)”类型结果,其
中“T”是传递参数中最⼩的通⽤类型。
arrayConcat
绑定作为参数传递的数组.
arrayConcat(arrays)
Arguments
arrays – 逗号分隔的数组[值].
Example
SELEC TarrayConcat([1,2],[3,4],[5,6]) AS res
┌─res───────────┐│ [1,2,3,4,5,6] │└───────────────┘
arrayElement(arr, n), 操作符 arr[n]
从数组’arr’中获取索引为’n’的元素。'n’必须是任何整数类型。数组中的索引从1开始。⽀持负数索引。在这种情况下,它从末尾选择相应的元素。例如,'arr [-1]'是数组中的最后⼀项。
如果索引落在数组边界之外,它将返回⼀些默认值(数字为0,字符串为空字符串等)。
has(arr, elem)
检查’arr’数组是否有’elem’元素。如果元素不在数组中,则返回0;如果在数组中,则返回1。
indexOf(arr, x)
如果它在数组中,则返回“x”元素的索引(从1开始);如果不在数组中,则返回0。
countEqual(arr, x)
返回数组中的等于 x 的元素数量. 等于 arrayCount (elem->elem = x, arr).
arrayEnumerate(arr)
返回数组 [1, 2, 3, …, length (arr) ]
函数通常被⽤于ARRAY JOIN。它允许为每个数组计算 count,在使⽤ARRAY JOIN后。例如:
SELECT count() AS Reaches,countIf(num=1) AS Hits FROM test.hits ARRAY JOIN GoalsReached,array
Enumerate(GoalsReached) AS num WHERE CounterID=160656 LIMIT 10
┌─Reaches─┬──Hits─┐
│ 95606 │ 31406 │
└─────────┴───────┘
在这个例⼦中,Reaches是转换次数(应⽤ARRAY JOIN后收到的字符串),Hits是页⾯浏览量(ARRAY JOIN之前的字符串)。在这种情况下,您可以通过更简单的⽅式获得相同的结果:
SELECT sum(length(GoalsReached)) AS Reaches, count() AS Hits FROM test.hits WHERE(CounterID=160656) AND notEmpty(GoalsReached)
┌─Reaches─┬──Hits─┐
│ 95606 │ 31406 │
└─────────┴───────┘
该功能也可⽤于⾼阶功能。例如,您可以使⽤它来获取匹配条件的元素的数组索引。
arrayEnumerateUniq(arr, …)
返回与源数组⼤⼩相同的数组,为每个元素指⽰其位置在具有相同值的元素中的位置。例如:
arrayEnumerateUniq([10,20,10,30])= [1,1,2,1]。
使⽤ARRAY JOIN和数组元素聚合时,此函数很有⽤。例:
SELECT Goals.IDASGoalID, sum(Sign)ASReaches, sumIf(Sign,num=1) AS Visits FROM test.visits ARRAYJOIN Goals, arrayEnumerateUniq(Goals.ID) AS num WHERE CounterID = 160656 GROUP BY GoalID ORDERBY Reaches DESC LIMIT 10
┌──GoalID─┬─Reaches─┬─Visits─┐
│ 53225 │ 3214 │ 1097 │
│ 2825062 │ 3188 │ 1097 │
│ 56600 │ 2803 │ 488 │
│ 1989037 │ 2401 │ 365 │
│ 2830064 │ 2396 │ 910 │
│ 1113562 │ 2372 │ 373 │
│ 3270895 │ 2262 │ 812 │
│ 1084657 │ 2262 │ 345 │
│ 56599 │ 2260 │ 799 │
│ 3271094 │ 2256 │ 812 │
└─────────┴─────────┴────────┘
在这个例⼦中,每个⽬标ID都有⼀个转换次数的计算(⽬标嵌套数据结构中的每个元素都是达到的⽬标,我们称之为转换)以及会话数量。如果没有ARRAY JOIN,我们可以将会话的数量计算为总和(Sign)。但是在这种特殊情况下,⾏被嵌套的Goals结构乘以,所以为了在此之后计算每个会话⼀次,
我们将⼀个条件应⽤到arrayEnumerateUniq(Goals.ID)函数的值。
arrayEnumerateUniq函数可以将多个⼤⼩相同的数组作为参数。在这种情况下,唯⼀性被考虑为所有数组中相同位置元素的元组。
SELECT array EnumerateUniq([1,1,1,2,2,2],[1,1,2,1,1,2]) AS res
┌─res───────────┐
│ [1,2,1,1,2,1] │
└───────────────┘
当使⽤ARRAY JOIN和嵌套的数据结构,并在这个结构中的多个元素之间进⼀步聚合时,这是必要的。
arrayPopBack
删除数组中的最后⼀项。
arrayPopBack(array)
参数
array – 数组.
例如
SELECT arrayPopBack([1,2,3]) AS res
┌─res───┐
│ [1,2] │
└───────┘
arrayPopFront
从数组中删除第⼀个元素
arrayPopFront(array)
参数
array – 数组.
⽰例
SELECT arrayPopFront([1,2,3]) AS res
┌─res───┐
│ [2,3] │
└───────┘
arrayPushBack
在数组的结尾添加⼀个元素
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论