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过滤的条件的数据,不一定是最新的数据。🤔