Clickhouse常用函数总结

  • Post author:
  • Post category:其他

Clickhouse常用函数还是比较丰富的,一下分别整理了字符串函数、数组函数、取整函数、日期函数、链路函数和一些常用的高阶函数,enjoy~~

一、字符串函数

1,字符串基础操作

select empty(’’);
select empty(123a’);  // 判断字符串是空为1,否则为0
返回 1
返回 0

select notEmpty(’’);
select notEmpty(123a’);  // 判断字符串是非空为1,否则为0
返回 0
返回 1

select length(’’);
select length(123a’);  // 返回字符串的长度
返回 0返回 4

select lower(‘aBc’);  // 将字符串转为小写
返回 abc

select upper(‘aBc’);  // 将字符串转为大写
返回 ABC

select reverse(‘abc’);  // 将字符串反转
返回 cba

select substring(123abcABC’, 2, 3);  // 字符串截取
返回 23a

select appendTrailingCharIfAbsent(123abc’, ‘b’);
select appendTrailingCharIfAbsent(123abc’, ‘c’);  // 如果字符串s非空,则将s后追加一个字符c(s最后一个字符与c不同),否则不处理
返回 123abcb
返回 123abc

2、字符串切割:

select splitByChar(-, ‘qw-asaf-asfqw-2312-asd’) // 以单个字符分割字符串
返回:[‘qw’,‘asaf’,‘asfqw’,2312,‘asd’]

select splitByString(-, ‘qw-asaf-asfqw-2312-asd’)splitByString(-a’, ‘qw-asaf-asfqw-2312-asd’);   //以单个或多个字符分割字符串
返回:[‘qw’,‘asaf’,‘asfqw’,2312,‘asd’] [‘qw’,‘saf’,‘sfqw-2312,‘sd’]

3,字符串拼接

select concat(123, ‘abc’, ‘ABC’);   // 将字符串拼接
返回:123abcABC

4,字符串替换

select replaceOne(‘asd123cbbj464sd’, ‘sd’,-);   //替换第一个匹配到的pattern
返回 a-123cbbj464sd

select replaceOne(‘asd123cbbj464sd’, ‘sd’,-);    //替换所有匹配到的pattern
返回 a-123cbbj464-

select replaceRegexpOne(‘Hello, World!, ‘o’, '- ');   // 正则匹配替换第一个匹配到的pattern
返回 Hell- , World!

select replaceRegexpAll(‘Hello, World!,^, 'here: ')
select replaceRegexpAll(‘Hello, World!, ‘o’, '-- '); //正则匹配替换所有匹配到的pattern
返回 here: Hello, World!  
返回 Hell-- , W-- rld!

5,字符串查找

select match(‘avhsca’,'vh’); // 字符串正则匹配,返回0或1
返回 1

select extract(‘iioomAj12123124OOBJB’, ‘\d+’);  //返回匹配到的第一个子串
返回 12123124

select extractAll(‘iioomAj12123124OOBJ123B’, ‘\d+’); // 返回匹配到的所有子串,输出列表
返回 [12123124,123]

select like(‘avhsca’,’%vh%’)
select like(‘avhsca’,’%vabjh%’);  // 匹配到的数据返回1,否则返回0
返回 1
返回 0

select notLike(‘avhsca’,’%vh%’)
select notLike(‘avhsca’,’%vabjh%’);  // 与like()函数相反
返回 0
返回 1

select position('ckhelloworldhellospark','hello') AS positionSearch; // 显示hello在字符串中第一个出现的位置。
返回 3

6、json解析:

select visitParamExtractString('{"name":"zss","age":21}' , 'name') ;

二、数组函数

1、数组定义:

select array('a','b','b','c');

2、返回数组下标

select arrayEnumerate(['a','b','c'])

3、数组求和

select arraySum([1,2,3,4]);     --10
select arrayCumSum([1,2,3,4]);  --[1,3,6,10]

4、数组去重:

select arrayDistinct(['a','b','b','c']);  --['a','b','c']

5、数组去重统计个数

select uniqArray(['a','b','b','c']);      --3

6、合并数组:

select arrayConcat(['a','b'],['hello','jim'],['e','f'])

7、数组添加、移除元素:

select arrayPushBack(['a','b'],'c');
select arrayPopBack(['a','b','c']);

8、数组排序:

select arraySort(range(2, 10, 2));
select arrayReverseSort(range(2, 10, 2));

9、数组反转

select arrayReverse(['a','b','b','c']);  --['c','b','b','a']

10、数组拉链操作:

select arrayZip(['a','b','c'],['1','2','3'])

三、取整函数

1,向下取数

格式:floor(x[, N])
示例 :
select floor(123.883, 1)
select floor(123.883, -1);  
返回 123.8
返回 120

2,向上取数

格式:ceil(x[, N])
示例:
select ceil(123.883, 1);
select ceil(123.883, -1);
返回 123.9
返回 130

3,四舍五入

格式:round(x[, N])
示例:
select round(123.883, 1);
select round(123.883, -1);
返回 123.9
返回 120

四、日期函数

1,现在日期

now()         // 2023-03-02 06:10:00  取当前时间
toYear()      // 2023                             取日志中的年份
toMonth()  // 03                                   取日子中的月份
today()      // 2023-03-02                   今天的日期
yesterday()  // 2023-03-01                昨天的日期
toDayOfYear()  //                          取一年中的第几天
toDayOfWeek()  // 4                           取一周中的第几天
toHour()           06                              取小时
toMinute()      10                                取分钟
toSecond()    00                                 取秒
toStartOfYear()    2023-01-01              取一年中的第一天
toStartOfMonth()   2023-03-01           取当月的第一天
toStartOfQuarter(time)
 
 
 
formatDatetime(now(), '%Y-%m-%d')   // 2023-03-02  指定时间格式
toYYYYMM()                              //202303             
toYYYYMMDD()                            //20230302
toYYYYMMDDhhmmss()                      //20230302061000
 
 
toUnixTimestamp(time)datetime格式转换成Unix时间戳
toQuarter(time)                       季度(一年分为四个季度。1(一季度:1-3,2(二季度:4-6,3(三季度:7-9,4(四季度:10-12)

2,未来日期

-- 第一种,日期格式(指定日期,需注意时区的问题)
WITH
    toDate('2023-03-02') AS date,
    toDateTime('2023-03-02 06:10:00') AS date_time
SELECT
    addYears(date, 1) AS add_years_with_date,
    addYears(date_time, 0) AS add_years_with_date_time;

-- 第二种,日期格式(当前,本地时间)
WITH
    toDate(now()) as date,
    toDateTime(now()) as date_time
SELECT
    now() as now_time,-- 当前时间
    -- 之后1年
    addYears(date, 1) AS add_years_with_date,                  
    addYears(date_time, 1) AS add_years_with_date_time,

    -- 之后1月
    addMonths(date, 1) AS add_months_with_date,                 
    addMonths(date_time, 1) AS add_months_with_date_time,

    --之后1周
    addWeeks(date, 1) AS add_weeks_with_date,                   
    addWeeks(date_time, 1) AS add_weeks_with_date_time,

    -- 之后1天
    addDays(date, 1) AS add_days_with_date,                     
    addDays(date_time, 1) AS add_days_with_date_time,

    --之后1小时
    addHours(date_time, 1) AS add_hours_with_date_time,  

    --之后1分中       
    addMinutes(date_time, 1) AS add_minutes_with_date_time,

    -- 之后10秒钟     
    addSeconds(date_time, 10) AS add_seconds_with_date_time,

     -- 之后1个季度    
    addQuarters(date, 1) AS add_quarters_with_date,            
    addQuarters(date_time, 1) AS add_quarters_with_date_time;

3,过去日期

WITH
    toDate(now()) as date,
    toDateTime(now()) as date_time
SELECT
    subtractYears(date, 1) AS subtract_years_with_date,
    subtractYears(date_time, 1) AS subtract_years_with_date_time,
    subtractQuarters(date, 1) AS subtract_Quarters_with_date,
    subtractQuarters(date_time, 1) AS subtract_Quarters_with_date_time,
    subtractMonths(date, 1) AS subtract_Months_with_date,
    subtractMonths(date_time, 1) AS subtract_Months_with_date_time,
    subtractWeeks(date, 1) AS subtract_Weeks_with_date,
    subtractWeeks(date_time, 1) AS subtract_Weeks_with_date_time,
    subtractDays(date, 1) AS subtract_Days_with_date,
    subtractDays(date_time, 1) AS subtract_Days_with_date_time,
    subtractHours(date_time, 1) AS subtract_Hours_with_date_time,
    subtractMinutes(date_time, 1) AS subtract_Minutes_with_date_time,
    subtractSeconds(date_time, 1) AS subtract_Seconds_with_date_time;

4,计算时间差值

-- 第一种:指定时间计算差值示例
WITH
    toDateTime('2023-03-02 06:10:10', 'Asia/Shanghai') as date_shanghai_one,
    toDateTime('2023-05-31 11:20:30', 'Asia/Shanghai') as date_shanghai_two
SELECT
    dateDiff('year', date_shanghai_one, date_shanghai_two) as diff_years,
    dateDiff('month', date_shanghai_one, date_shanghai_two) as diff_months,
    dateDiff('week', date_shanghai_one, date_shanghai_two) as diff_week,
    dateDiff('day', date_shanghai_one, date_shanghai_two) as diff_days,
    dateDiff('hour', date_shanghai_one, date_shanghai_two) as diff_hours,
    dateDiff('minute', date_shanghai_one, date_shanghai_two) as diff_minutes,
    dateDiff('second', date_shanghai_one, date_shanghai_two) as diff_seconds;

-- 第二种:本地当前时间示例
WITH
    now() as date_time
SELECT
    dateDiff('year', date_time, addYears(date_time, 1)) as diff_years,
    dateDiff('month', date_time, addMonths(date_time, 2)) as diff_months,
    dateDiff('week', date_time, addWeeks(date_time, 3)) as diff_week,
    dateDiff('day', date_time, addDays(date_time, 3)) as diff_days,
    dateDiff('hour', date_time, addHours(date_time, 3)) as diff_hours,
    dateDiff('minute', date_time, addMinutes(date_time, 30)) as diff_minutes,
    dateDiff('second', date_time, addSeconds(date_time, 35)) as diff_seconds;

五、链路函数

1,sequenceMatch(pattern)(time, cond1, cond2, …)

判断是否存在满足根据时间排序且依次条件1,条件2,…条件n都成立的链路.若满足 返回 1,否则为 0 .

2, sequenceCount(pattern)(time, cond1, cond2, …)

判断是否存在满足根据时间排序且依次条件1,条件2,…条件n都成立的链路 若满足 返回出现的次数

3, windowFunnel(window)(time, cond1, cond2, …)

判断是否存在满足根据时间排序且依次条件1,条件2,…条件n都成立的链路. 并且设置链路的窗口时间. 一般用于计算漏斗模型

select uid,
       windowFunnel(4)(toDateTime(eventTime), eventid = 'login', eventid = 'view', eventid = 'buy') as funnel
from test_funnel
group by uid;

4,retention(cond1, cond2, …, cond32)

SELECT
    uid,
    retention(date = '2020-01-01', date = '2020-01-02', date = '2020-01-03') AS r
FROM retention_test
WHERE date IN ('2020-01-01', '2020-01-02', '2020-01-03')
GROUP BY uid
ORDER BY uid ASC

六、高阶函数

1,If

If 可以加到任何聚合函数之后。
加了-If之后聚合函数需要接受一个额外的参数,一个条件(Uint8类型),如果条件满足,那聚合函数处理当前的行数据,
如果不满足,那返回默认值(通常是0或者空字符串)。
使用条件聚合函数,您可以一次计算多个条件的聚合,而无需使用子查询和 JOIN例如,在Yandex.Metrica,条件聚合函数用于实现段比较功能。
sumIf(column, cond)

2,Array

Array后缀可以附加到任何聚合函数。
在这种情况下,聚合函数采用的参数 Array(T) 类型(数组)而不是 T 类型参数。
如果聚合函数接受多个参数,则它必须是长度相等的数组。
在处理数组时,聚合函数的工作方式与所有数组元素的原始聚合函数类似。
任何聚合函数都可以通过增加后缀 Array, 来使原来的参数类型 T 变为新的参数类型 Array(T)。
如果和 -If 组合,Array 必须先来,然后 If. 例: uniqArrayIf(arr, cond), quantilesTimingArrayIf(level1, level2)(arr, cond)。由于这个顺序,该 cond 参数不会是数组。
示例1:
sumArray(arr) 对 Arrays 中的所有元素进行求和,即 sum(arraySum(arr))。
uniqArray(arr) – 计算``arr`中唯一元素的个数。这可以是一个更简单的方法:
uniq(arrayJoin(arr)),但它并不总是可以添加 arrayJoin 到查询。

3,ForEach

将对 table 使用的聚合函数,转换为对数组的聚合函数。对数组的每一项进行处理,返回一个结果数组。

4,OrDefault

格式:xxxOrDefault(x)
如果聚合函数没有输入值,则使用此组合器它返回其返回数据类型的默认值。 适用于可以采用空输入数据的聚合函数。
注意:OrDefault 可与其他组合器一起使用。

5,OrNull

格式:xxxOrNull(x)
更改聚合函数的行为。
此组合器将聚合函数的结果转换为 可为空 数据类型。 如果聚合函数没有值来计算它返回 NULL.
注意:OrNull 可与其他组合器一起使用。

6,Resample

格式:xxxResample(start, end, step)(<aggfunction_params>, resampling_key)
允许您将数据划分为组,然后单独聚合这些组中的数据。 通过将一列中的值拆分为间隔来创建组。

参数:
start — resampling_key 开始值。
stop — resampling_key 结束边界。 区间内部不包含 stop 值,即 [start, stop).
step — 分组的步长。 The aggFunction 在每个子区间上独立执行。
resampling_key — 取样列,被用来分组.
aggFunction_params — aggFunction 参数。

返回值:
aggFunction 每个子区间的结果,结果为数组。

7,State

返回的不是结果值,返回的是中间状态。 这个是与 AggregatingMergeTree 来配合使用的。

如果应用此combinator,则聚合函数不会返回结果值(例如唯一值的数量 uniq 函数),但是返回聚合的中间状态(对于 uniq,返回的是计算唯一值的数量的哈希表)。 这是一个 AggregateFunction(...) 可用于进一步处理或存储在表中以完成稍后的聚合。

要使用这些状态,请使用:
AggregatingMergeTree 表引擎。
finalizeAggregation 功能。
runningAccumulate 功能。
-Merge combinator
-MergeState combinator

8,Merge

聚合函数会把中间状态会为参数,进行 Merge,来完成聚合,返回最终的结果值。
如果应用此组合器,则聚合函数将中间聚合状态作为参数,组合状态以完成聚合,并返回结果值。

9,MergeState

-Merge 类似,但是返回的不是结果值,而是类似于 -State 的中间状态。
以与-Merge 相同的方式合并中间聚合状态。 但是,它不会返回结果值,而是返回中间聚合状态,类似于-State。

文章参考:
https://clickhouse.com/docs/en/intro
https://blog.csdn.net/u012111465/article/details/85250030


版权声明:本文为weixin_42011858原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。