常用函数汇总

[日期]

注:所有的时间日期函数都可以在第二个可选参数中接受时区参数。示例: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. Unity中利用遗传算法训练MLP

    Unity中利用遗传算法训练MLP 梯度下降法训练神经网络通常需要我们给定训练的输入-输出数据,而用遗传算法会便捷很多,它不需要我们给定好数据,只需要随机化多个权重进行N次"繁衍进化&quo ...

  2. Cloudflare D1 - 免费数据存储

    前言 自从上次将博客项目的图片从 七牛云 迁到了 Cloudflare R2 之后就发现,Cloudflare 这个赛博菩萨的产品是真的不错,非常的适合白嫖,DevNow 项目作为一个开源博客,整体来 ...

  3. ARC119F 题解

    前言 ARC119F 好厉害,是没见过的自动机 DP. 正文 [1] 分析 主要分析一下为什么这么写. [2] 状态设计 [3] 自动机状态转移 感觉状态设计中最难的就是如何处理带 \(O\) 的. ...

  4. 简单聊聊 CORS 攻击与防御

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:霁明 什么是CORS CORS(跨域资源共享)是一种基于H ...

  5. JavaScript——基础语法

    书写语法    输出语句    变量    数据类型    运算符        == 与 === 区别:       ==:         1.判断类型是否一样,如果不一样,则进行类型转换     ...

  6. Dart 2.14 版现已发布

    支持 Apple Silicon,增加了默认的 lint.更好的工具和新的语言功能提高生产力. 本月,我们发布了 Dart SDK 2.14 的正式版,新的版本旨在通过独特的可移植性.生产力和稳健性组 ...

  7. Android应用启动全流程分析(源码深度剖析)

    目录 1.前言 2.大纲 3. Input触控事件处理流程 3.1 系统机制分析 3.2 结合Systrace分析 4. 应用进程的创建与启动 4.2 创建应用进程 4.2.1 AMS 发送socke ...

  8. 利用CSV路径文件和.png图像,生成3D原图。并展示部分分割图像

    具体代码 ,请看的的github if __name__ == "__main__": df = pd.read_csv(r'D:/compation/kaggle/train.c ...

  9. Java日期时间API系列32-----Jdk8中java.time包中的新的日期时间API类应用,时间工具包 xk-time 1.0.0 版本完成。

    从Java日期时间API系列第一篇博客开始,利用业余时间对Java日期时间API源码进行了系统的.多次的阅读实践,包括Date.LocalDate.LocalDateTime.LocalTime.In ...

  10. Java日期时间API系列23-----Jdk8中java.time包中的新的日期时间API类,获取准确开始时间00:00:00,获取准确结束时间23:59:59等

    有时候,往往需要统计某个时间区间的销量等问题,这就需要准确的起始时间,获取准确开始时间00:00:00,获取准确结束时间23:59:59.下面增加了一一些方法,获取当天起始时间,昨天起始时间,当前月第 ...