常用函数汇总

[日期]

注:所有的时间日期函数都可以在第二个可选参数中接受时区参数。示例:Asia / Yekaterinburg。在这种情况下,它们使用指定的时区而不是本地(默认)时区。

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

  

未来日期:

-- 第一种,日期格式(指定日期,需注意时区的问题)
WITH
toDate('2019-09-09') AS date,
toDateTime('2019-09-09 00:00: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;

过去日期:

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;

计算时间差值:

-- 第一种:指定时间计算差值示例
WITH
toDateTime('2019-07-30 10:10:10', 'Asia/Shanghai') as date_shanghai_one,
toDateTime('2020-10-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;

聚合函数组合器

聚合函数的名称可以附加一个后缀。 这改变了聚合函数的工作方式。

  • If

  • Array

  • ForEach

  • OrDefault

  • OrNull

  • Resample

  • State

  • Merge

  • MergeState

2. 创建测试表

sql
-- 创建雇员表
CREATE TABLE emp(
`empno` UInt16 NOT NULL COMMENT '员工编码',
`ename` String COMMENT '员工姓名',
`job` String COMMENT '职位',
`mgr_no` UInt16 COMMENT '领导的员工编号',
`hiredate` Date COMMENT '入职日期',
`sal` decimal(7, 2) COMMENT '月薪',
`comm` decimal(7, 2) COMMENT '奖金',
`deptno` UInt8 COMMENT '所属部门编号'
)
ENGINE = MergeTree()
order by empno; -- 向雇员表写入数据
insert into emp (empno, ename, job, mgr_no, hiredate, sal, comm, deptno) values
(7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20),
(7499, 'ALLEN', 'SALESMAN', 7698,'1981-02-20', 1600, 300, 30),
(7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30),
(7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20),
(7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30),
(7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30),
(7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10),
(7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20),
(7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10),
(7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30),
(7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20),
(7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30),
(7902, 'FORD', 'ANALYST', 7566,'1981-12-02', 3000, null, 20),
(7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10); -- 创建部门表
create table dept(
`deptno` UInt8 not null COMMENT '部门编码',
`dname` String COMMENT '部门名称',
`loc` String COMMENT '部门所在地点'
)
ENGINE = MergeTree()
order by deptno; -- 向部门表写入数据
insert into default.dept (deptno, dname, loc) values
(10, 'ACCOUNTING', 'NEW YORK'),
(20, 'RESEARCH', 'DALLAS'),
(30, 'SALES', 'CHICAGO'),
(40, 'OPERATIONS', 'BOSTON');

3. If

  • -If 可以加到任何聚合函数之后。

  • 加了-If之后聚合函数需要接受一个额外的参数,一个条件(Uint8类型),如果条件满足,那聚合函数处理当前的行数据,

  • 如果不满足,那返回默认值(通常是0或者空字符串)。

  • 使用条件聚合函数,您可以一次计算多个条件的聚合,而无需使用子查询和 JOIN例如,在Yandex.Metrica,条件聚合函数用于实现段比较功能。

  • sumIf(column, cond)
sql
--
-- 将编号为 10 的 部分工资求和
select sumIf(sal,deptno=10) from emp;
┌─sumIf(sal, equals(deptno, 10))─┐
│ 8750 │
└────────────────────────────────┘
-- 同
select sum(sal) from emp where deptno=10;
┌─sum(sal)─┐
│ 8750 │
└──────────┘
  • countIf(cond)
sql
-- 统计工资大于两千多人数
select countIf(sal,sal>2000) from emp; ┌─countIf(sal, greater(sal, 2000))─┐
│ 6 │
└──────────────────────────────────┘ -- 同
select count(1) from emp where sal > 2000;
┌─count()─┐
│ 6 │
└─────────┘
  • avgIf(x, cond)
sql
select avgIf(sal,sal>2000) from emp;

┌─avgIf(sal, greater(sal, 2000))─┐
│ 3212.5 │
└────────────────────────────────┘

4. Array

  • -Array后缀可以附加到任何聚合函数。
  • 在这种情况下,聚合函数采用的参数 Array(T) 类型(数组)而不是 T 类型参数。
  • 如果聚合函数接受多个参数,则它必须是长度相等的数组。
  • 在处理数组时,聚合函数的工作方式与所有数组元素的原始聚合函数类似。
  • 任何聚合函数都可以通过增加后缀 Array, 来使原来的参数类型 T 变为新的参数类型 Array(T)。

如果和 -If 组合,Array 必须先来,然后 If. 例: uniqArrayIf(arr, cond), quantilesTimingArrayIf(level1, level2)(arr, cond)。由于这个顺序,该 cond 参数不会是数组。

示例1:

示例2:

  • sumArray(arr) 对 Arrays 中的所有元素进行求和,即 sum(arraySum(arr))。
sql

select sumArray(array(1,2,3,4,5));
┌─sumArray(array(1, 2, 3, 4, 5))─┐
│ 15 │
└────────────────────────────────┘ select sum(arraySum(array(1,2,3,4,5)));
┌─sum(arraySum(array(1, 2, 3, 4, 5)))─┐
│ 15 │
└─────────────────────────────────────┘
  • uniqArray(arr) – 计算``arr`中唯一元素的个数。这可以是一个更简单的方法:
  • uniq(arrayJoin(arr)),但它并不总是可以添加 arrayJoin 到查询。
sql
select uniqArray(array(1,1,2,2,3,3));

┌─uniqArray(array(1, 1, 2, 2, 3, 3))─┐
│ 3 │
└────────────────────────────────────┘
  • -If 和 -Array 可以组合使用,但是 Array 必须在前,If 在后。

sql
-- sumArrayIf
select sumArrayIf(array(number),number % 2 == 0) from (
select number from numbers(5)
) t ; ┌─sumArrayIf(array(number), equals(modulo(number, 2), 0))─┐
│ 6 │
└─────────────────────────────────────────────────────────┘

5. -ForEach

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

sql
with (array(1,2,3) ,array(4,5,6)) as a
select sumForEach(a1) from (
select a.1 as a1
union all
select a.2 as a1
) t ;
┌─sumForEach(a1)─┐
│ [5,7,9] │
└────────────────┘ with (array(1,2,3) ,array(4,5,6,7)) as a
select countForEach(a1) from (
select a.1 as a1
union all
select a.2 as a1
) t ;
┌─countForEach(a1)─┐
│ [2,2,2,1] │
└──────────────────┘

6. -OrDefault

  • xxxOrDefault(x)

如果聚合函数没有输入值,则使用此组合器它返回其返回数据类型的默认值。 适用于可以采用空输入数据的聚合函数。

-OrDefault 可与其他组合器一起使用。

语法

sql
SELECT avg(number), avgOrDefault(number) FROM numbers(0)
┌─avg(number)─┬─avgOrDefault(number)─┐
│ nan │ 0 │
└─────────────┴──────────────────────┘ SELECT avgOrDefaultIf(x, x > 10) FROM (
SELECT toDecimal32(1.23, 2) AS x
);
┌─avgOrDefaultIf(x, greater(x, 10))─┐
│ 0 │
└───────────────────────────────────┘

7. -OrNull

  • xxxOrNull(x)

  • 更改聚合函数的行为。

  • 此组合器将聚合函数的结果转换为 可为空 数据类型。 如果聚合函数没有值来计算它返回 NULL.

  • -OrNull 可与其他组合器一起使用。

语法

sql
SELECT sumOrNull(number), toTypeName(sumOrNull(number)) FROM numbers(10) WHERE number > 10;
┌─sumOrNull(number)─┬─toTypeName(sumOrNull(number))─┐
│ ᴺᵁᴸᴸ │ Nullable(UInt64) │
└───────────────────┴───────────────────────────────┘ -- -OrNull 可与其他组合器一起使用。 当聚合函数不接受空输入时,它很有用
SELECT avgOrNullIf(x, x > 10)
FROM
(
SELECT toDecimal32(1.23, 2) AS x
)
┌─avgOrNullIf(x, greater(x, 10))─┐
│ ᴺᵁᴸᴸ │
└────────────────────────────────┘

8. -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 每个子区间的结果,结果为数组。

示例

考虑一下 people 表具有以下数据的表结构:

sql
-- 将工资从 1000 到 400 的人分组,分组工资间隔为 1000
select
groupArrayResample(1000,4000,1000)(sal,toUInt16(sal)) as salGroup
from emp; ┌─salGroup───────────────────────────────────────────────────────┐
│ [[1600,1250,1250,1500,1100,1300],[2975,2850,2450],[3000,3000]] │
└────────────────────────────────────────────────────────────────┘ select
countResample(1000,4000,1000)(sal,toUInt16(sal)) as countGroup,
avgResample(1000,4000,1000)(sal,toUInt16(sal)) as avgGroup
from emp;
┌─countGroup─┬─avgGroup─────────────────────────────────────┐
│ [6,3,2] │ [1333.3333333333333,2758.3333333333335,3000] │
└────────────┴──────────────────────────────────────────────┘

9. State

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

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

要使用这些状态,请使用:

10. Merge

聚合函数会把中间状态会为参数,进行 Merge,来完成聚合,返回最终的结果值。

如果应用此组合器,则聚合函数将中间聚合状态作为参数,组合状态以完成聚合,并返回结果值。

11. MergeState

与 -Merge 类似,但是返回的不是结果值,而是类似于 -State 的中间状态。

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

更多操作:

Clickhouse之常用函数操作的更多相关文章

  1. SQL中常用函数操作

    --在SQL SERVER中批量替换字符串的方法 update [Table] set [Field] = REPLACE([Field],'被替换的原内容','要替换的内容') update HBb ...

  2. scala集合和高级函数操作

    scala常用函数操作 reduceLeft   是将集合的元素从左向右进行所需要的相应操作,图以减法为例展示,表达的算法是 : 1-2-3-4-5 例: (1 to 5).reduceLeft(_ ...

  3. day5_7.3 数据类型的各种函数操作

    昨日补充: 1.在代码的编写中,总会有一些分支编写不出来,为了不影响整个系统的跑动,可以使用pass关键字进行跳过.如 count=0 while count<10: if count<5 ...

  4. MATLAB 常用形态学操作函数

    常用形态学操作函数(转自:http://blog.sina.com.cn/s/blog_4c52e9e20100e5if.html) 1.dilate函数 该函数能够实现二值图像的膨胀操作,有以下形式 ...

  5. Spark常用函数讲解之Action操作

    摘要: RDD:弹性分布式数据集,是一种特殊集合 ‚ 支持多种来源 ‚ 有容错机制 ‚ 可以被缓存 ‚ 支持并行操作,一个RDD代表一个分区里的数据集RDD有两种操作算子:         Trans ...

  6. nodejs文件操作模块FS(File System)常用函数简明总结(转)

    件系统操作相关的函数挺多的.首先可以分为两大类. 一类是异步+回调的. 一类是同步的. 在这里只对异步的进行整理,同步的只需要在函数名称后面加上Sync即可 1. 首先是一类最常规的读写函数,函数名称 ...

  7. 操作 numpy 数组的常用函数

    操作 numpy 数组的常用函数 where 使用 where 函数能将索引掩码转换成索引位置: indices = where(mask) indices => (array([11, 12, ...

  8. 第七节,TensorFlow编程基础案例-TensorBoard以及常用函数、共享变量、图操作(下)

    这一节主要来介绍TesorFlow的可视化工具TensorBoard,以及TensorFlow基础类型定义.函数操作,后面又介绍到了共享变量和图操作. 一 TesnorBoard可视化操作 Tenso ...

  9. php中文件操作常用函数有哪些

    php中文件操作常用函数有哪些 一.总结 一句话总结:读写文件函数 判断文件或者目录是否存在函数 创建目录函数 file_exists() mkdir() file_get_content() fil ...

  10. Python常用时间操作总结【取得当前时间、时间函数、应用等】转载

    Python常用时间操作总结[取得当前时间.时间函数.应用等] 转载  2017-05-11   作者:清风乐逍遥    我要评论 这篇文章主要介绍了Python常用时间操作,包括取得当前时间.时间函 ...

随机推荐

  1. 熔断、限流、降级 —— SpringCloud Hystrix

    概述 Hystrix 为 微服务架构提供了一整套服务隔离.服务熔断和服务降级的解决方案.它是熔断器的一种实现,主要用于解决微服务架构的高可用及服务雪崩等问题 Hystrix 的特性如下: 服务熔断:H ...

  2. Kubelet证书自动续签(为 kubelet 配置证书轮换)

    1.概述 Kubelet 使用证书进行 Kubernetes API 的认证. 默认情况下,这些证书的签发期限为一年,所以不需要太频繁地进行更新. Kubernetes 包含特性 Kubelet 证书 ...

  3. 真人模特失业?AI虚拟试衣一键成图,IDM-VTON下载介绍

    在电商行业竞争尤为激烈的当下,除了打价格战外,如何有效的控制成本,是每个从业者都在思考的问题 IDM-VTON是一个AI虚拟换装工具,旨在帮助服装商家解决约拍模特导致的高昂成本问题,只需一张服装图片, ...

  4. 北京智和信通:IT资产全生命周期运维监控管理方案

    IT资产是企业开展正常业务运营和拓展不可或缺的资源,也是企业财产的重要载体.随着信息科技的快速发展,各企业对IT资产的依赖逐渐增强,IT资产的可靠性和有效性面临着愈来愈大的挑战.例如IT资产管理混乱, ...

  5. Word、Excel办公书的资源下载

    我是清华社编辑,下载资源没有版权问题,可供读者个人学习用,但不允许商用. 微信扫描,清华社网盘,可转自己邮箱下载.安全,无风险. <Word/Excel/PPT 2019商务办公从入门到精通&g ...

  6. kotlin协程——>协程上下文与调度器

    协程上下⽂与调度器 协程总是运⾏在⼀些以 CoroutineContext 类型为代表的上下⽂中,它们被定义在了 Kotlin 的标准库 ⾥. 协程上下⽂是各种不同元素的集合.其中主元素是协程中的 J ...

  7. Kali Linux 更新 一条命令搞定

    Kali Linux 更新 一条命令搞定 sudo apt-get update && sudo apt-get upgrade && sudo apt-get dis ...

  8. 五、Spring Boot集成Spring Security之认证流程2

    二.概要说明 上文已详细介绍了四.Spring Boot集成Spring Security之认证流程 本文则着重介绍用户名密码认证过滤器UsernamePasswordAuthenticationFi ...

  9. SQL语法-列的新增、删除

    MySQL的语法: 新增列 ALTER TABLE `xxdb`.`xxtable` ADD COLUMN `xx_flag` varchar(1) NULL; 删除列 ALTER TABLE `xx ...

  10. KubeSphere 社区双周报|2024.06.07-06.20

    KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...