Clickhosue 强大的函数,argMin() 和argMax()函数
说实话,我喜欢Clickhouse 的函数,简单操作,功能强大。今天需要给大家介绍两个函数,argMin(),argMax()
1.argMax():计算 ‘arg’ 最大值 ‘val’ 价值。 如果有几个不同的值 ‘arg’ 对于最大值 ‘val’,遇到的第一个值是输出。argMin() 与argMax() 的功能正好是相反的,是Clickhouse官方文档对这个函数的解释,看官应该看知道这个函数是用途了吧。
当然上图是argMin() 函数的简单案例,这里我想到的几个业务场景的使用案例,仅供参考。
1 drop table if exists salary;
2 create table salary
3 (
4 `id` Int32,
5 `user` String,
6 `user_id` Int32,
7 `salary` Int32 ,
8 `created_at` Datetime ,
9 `updated_at` Datetime
10 ) engine = Memory;
11
12 select * from salary;
13
14 insert into salary (id,user,user_id,salary,created_at,updated_at) Values
15 (1,'Jim',101,10000,'2020-05-01 00:00:00','2020-05-01 00:00:00'),
16 (2,'Tom',102,15000,'2020-05-01 01:00:00','2020-05-01 00:00:00'),
17 (3,'Tony',103,20000,'2020-05-01 00:00:00','2020-05-01 00:00:00'),
18 (4,'Judy',104,25000,'2020-05-01 00:00:00','2020-05-01 00:00:00'),
19 (5,'Lucy',105,80000,'2020-05-01 00:00:00','2020-05-01 00:00:00'),
20
21 select * from salary;
业务场景一:查看salary 最高和最小的user
1 select 'Max Salary User' as Type ,argMax(user,salary) as user from salary
2 UNION ALL
3 select 'Min Salary User' as Type, argMin(user,salary) as user from salary
结果:
业务场景二:这两个函数可以应用到数据updated 上,非常好用,比如user_id = 101 的salary 数据updated 了,数据产生了一条新的记录;我们可以根据updated_at的时间拿到每个用户一段时间内数据的最新记录或者最早记录;
1 insert into salary (id,user,user_id,salary,created_at,updated_at) Values
2 (1,'Jim',101,15000,'2020-05-02 00:00:00','2020-05-02 00:00:00');
3
4 select * from salary;
结果:
A. 查看每个user的最新工资记录:
1 select
2 id,
3 argMax(user,updated_at) as user,
4 argMax(user_id,updated_at) as user_id,
5 argMax(salary,updated_at) as salary,
6 argMax(created_at,updated_at) as created_at
7 from salary
8 group by id
9 order by id asc;
最新记录:我们通过结果可以看到user =Jim,是工资有调整了,最开始的时候salary = 10000,目前的salary = 15000,通过argMax() 取到最新的记录,这个函数间接的实现了数据的updated 的功能,clickhouse 既可以查看历史的所有数据,又可以很好的查看最新的数据。
argMin()查看最早的数据:
1 select
2 id,
3 argMin(user,updated_at) as user,
4 argMin(user_id,updated_at) as user_id,
5 argMin(salary,updated_at) as salary,
6 argMin(created_at,updated_at) as created_at
7 from salary
8 group by id
9 order by id asc;
结果:
业务场景想象:想知道公司每个user 的最早期的工资和目前的薪资,以及涨幅和变化情况,根据员工表现合理安排员工的福利:
1 select user_id,
2 argMax(user,updated_at) as user,
3 argMin(salary,updated_at) as history_salary,
4 argMax(salary,updated_at) as lasted_salary,
5 argMax(salary,updated_at) - argMin(salary,updated_at) as difference,
6 (argMax(salary,updated_at) - argMin(salary,updated_at)) / argMin(salary,updated_at) as "The percentage of difference"
7 from salary
8 group by user_id;
结果:
我们了解了这两个函数,相信还有很多很多的业务场景需要的场景都会用上它们。
Please Note:
需要注意的是argMax() ,argMin() 函数的时候,如果有 用上where 条件的时候,就要优先去一段时间范围的数据,然后嵌套后再做Where 条件的过滤哦;否则你符合你where过滤的条件的数据,不一定是最新的数据。
Clickhosue 强大的函数,argMin() 和argMax()函数的更多相关文章
- argmin ,argmax函数
在数学中,ARG MAX(或ARGMAX)代表最大值,即给定参数的点集,给定表达式的值达到其最大值: 换一种说法, 是f(x)具有最大值M的x的值的集合.例如,如果f(x)是1- | x |,那么它在 ...
- tf.argmax()函数作用
tf.argmax()函数原型: def argmax(input, axis=None, name=None, dimension=None, output_type=dtypes.int64) 作 ...
- C++ Primer--虚函数与纯虚函数的区别
首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数没有被实现. 定义纯虚函数是为了实 ...
- 你好,C++(29)脚踏两只船的函数不是好函数 5.4 函数设计的基本规则
5.4 函数设计的基本规则 函数是C++程序的基本功能单元,就像一块块砖头可以有规则地垒成一座房子,而一个个函数也可以有规则地组织成一个程序.我们在大量使用他人设计好的函数的同时,也在设计大量的函数 ...
- 【转】 C++易混知识点2. 函数指针和指针函数的区别
我们时常在C++开发中用到指针,指针的好处是开销很小,可以很方便的用来实现想要的功能,当然,这里也要涉及到指针的一些基本概念.指针不是基本数据类型,我们可以理解他为一种特殊类型的对象,他占据一定空间, ...
- 洗礼灵魂,修炼python(21)--自定义函数(2)—函数文档,doctest模块,形参,实参,默认参数,关键字参数,收集参数,位置参数
函数文档 1.什么是函数文档: 就是放在函数体之前的一段说明,其本身是一段字符串,一个完整的函数需要带有函数文档,这样利于他人阅读,方便理解此函数的作用,能做什么运算 2.怎么查看函数文档: func ...
- Python基础(函数,函数的定义,函数的调用,函数的参数,递归函数)
1.函数 我们知道圆的面积计算公式为: S = πr2 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需要计算3个不同大小的圆的面积: r1 = 12.34 r2 = 9.08 r3 = ...
- python协程函数、递归、匿名函数与内置函数使用、模块与包
目录: 协程函数(yield生成器用法二) 面向过程编程 递归 匿名函数与内置函数的使用 模块 包 常用标准模块之re(正则表达式) 一.协程函数(yield生成器用法二) 1.生成器的语句形式 a. ...
- C/C++函数指针,指针函数的用法,用处
先看函数指针 int func2(int x); /* 声明一个函数 */ int (*q2) (int x); /* 声明一个函数指针 */ q2=func2; /* 将func函数的首地址 ...
随机推荐
- 【php】日期时间
一. 日期时间: a) 这是一块非常重要的内容,我们在windows当中,或者是将来要接触的定时器也好,都是需要使用到这一块内容的!二. PHP当中的日期时间: a) 时间戳:time()可以获取时间 ...
- Git常用命令(一)
$ git init 初始化仓库(会生成一个隐藏文件.git) $ git add + (文件名) 实现对指定文件的跟踪 $ git commit 提交更新$ git clone + URL 克隆远程 ...
- MTK Android 权限大全
Android权限大全 1.android.permission.WRITE_USER_DICTIONARY允许应用程序向用户词典中写入新词 2.android.permission.WRITE_SY ...
- 如何将本地项目上传到gitee
如何将本地项目上传到gitee不想废话,直入主题: 第一步:首先你得有一个gitee仓库(登录注册自己解决)友情提供: gitee官网地址. 首先:进入git额额官网(登录注册自己解决,没难度) 新建 ...
- Markdown语法详解-cnblog
博客的重要性 博客,英文名为Blog,它的正式名称为网络日记. 为什么要写博客? 需要总结和思考.有时候我们一直在赶路,却忘了放慢脚步 提升文笔组织能力 提升学习总结能力 提升逻辑思维能力 帮助他人, ...
- 2020-3-3 20175110王礼博 《网络对抗技术》Exp1 PC平台逆向破解
目录 1.实践目标与基础知识 2.直接修改程序机器指令,改变程序执行流程 3.通过构造输入参数,造成BOF攻击,改变程序执行流 4.注入Shellcode并执行 5.实验收获与感想 6.什么是漏洞?漏 ...
- beanshell自定义聚合报告时分线程组阶段展示
假设现在一共会加载100个线程,期望聚合报告中分别展示1-20,20-40,40-60,60-80的四个阶段的线程并发性能数据,而不是总体的统计数据 beanshell脚本,具体内容: import ...
- HBase协处理器加载的三种方式
本文主要给大家罗列了HBase协处理器加载的三种方式:Shell加载(动态).Api加载(动态).配置文件加载(静态).其中静态加载方式需要重启HBase. 我们假设我们已经有一个现成的需要加载的协处 ...
- k8s中token过期重新生成
k8s中token过期重新生成 通过kubeadm初始化之后,都会提供node加入的token 默认的token的有效期是24小时,当过期了,如何新生成呢 重新生成token: [root@k8s-m ...
- 条件变量 condition_variable wait
wait(阻塞当前线程,直到条件变量被唤醒) #include <iostream> #include <string> #include <thread> #in ...