ck高阶函数运用
数组函数
对数据中的特殊字符串进行替换,并根据分隔符进行切割,过滤掉为空的数组数据,对数据元素进行排序,在用分隔符拼接。
arrayStringConcat( arraySort( arrayDistinct( arrayFilter(o -> o != '' , splitByChar(';', assumeNotNull(REPLACE(POOR_APP_CATEGORY, ',', ';'))) ) ) ) , '; ' ) as "质差应用"
arraySort支持自定义排序
参数 1:lambda表达式,- 表示!asc排序方式参数 2:数组参数 3:权值顺序select arraySort((x, y) -> y, arrayDistinct( arrayFilter(o -> o != '' , splitByChar(';', '优;中;差'))), [0, 1, 2]);
['优','中','差']
select arraySort((x, y) -> - y, arrayDistinct( arrayFilter(o -> o != '' , splitByChar(';', '优;中;差'))), [0, 1, 2]);
['差','中','优']
argMax、argMin函数:获取某个列维度,对应的那一行数据。
获取时间最新的预警数据:
select PREWARN_ID,max(CREATE_DATE),argMax(END_DATE, CREATE_DATE) as END_DATE,argMax(CHECK_DATE, CREATE_DATE) as CHECK_DATE,argMax(STATUS, CREATE_DATE) as STATUS,argMax(MODIFY_USER, CREATE_DATE) as MODIFY_USER,argMax(WARN_TIMES, CREATE_DATE) as WARN_TIMES,MAX(RANK) as RANK, MAX(CITY) as CITYfrom ADO_SA_OVERSEA_BUSINESS.T_PRE_WARNING_STATUSgroup by PREWARN_ID HAVING STATUS = 0ORDER BY WARN_TIMES, CHECK_DATE, PREWARN_ID;
注意点:
该函数取不到null,会根据列维度排序,取最大(小)的不为空数据,所以请考虑数据中是否有null数据。
如果有,建议使用 如下判断数据的形式进行规避
select argMax(if(STATUS is null, '', STATUS), CREATE_DATE) as STATUS
问题
左连接取右表有默认值
select l.*, r.* from
( select 'a' as a ) l
left join
( select '1' as a, 1 as b ) r
on l.a = r.a;
配置:
select l.*, r.* from
( select 'a' as a ) l
left join
( select '1' as a, 1 as b ) r
on l.a = r.a SETTINGS join_use_nulls = 1;