Clickhosue 强大的函数,argMin() 和argMax()函数

Posted thxj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()函数的主要内容,如果未能解决你的问题,请参考以下文章

torch.argmax和argmin返回值

NumPy:在 3D 切片中使用来自 argmin 的 2D 索引数组

TypeError: reduction operation 'argmin' not allowed for this dtype

机器学习数学知识中令人费解的notation符号注解

在 Python 中为字典实现 argmin [重复]

数学中 arg min是什么意思