ClickHouse--18--argMin() 和argMax()函数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


argMin() 和argMax()函数

argMax(arg ,val):计算'val'字段最大值对应的arg, 如果 value 最大值对应多个 arg ,输出第一个arg值。

argMin() 与argMax() 的功能正好是相反的,👇是Clickhouse官方文档对这个函数的解释,看官应该看知道这个函数是用途了吧。

业务场景使用案例

1.准备表和数据:

sql 复制代码
 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

sql 复制代码
 select 'Max Salary User' as Type ,argMax(user,salary)  as user from salary
 UNION ALL
 select 'Min Salary User' as Type, argMin(user,salary)  as user from salar

业务场景二:根据更新时间获取最新/最早记录

这两个函数可以应用到数据updated 上,非常好用,比如user_id = 101 的salary 数据updated 了,数据产生了一条新的记录;

我们可以根据updated_at的时间拿到每个用户一段时间内数据的最新记录或者最早记录;

sql 复制代码
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;

argMax查看user最新记录:

sql 复制代码
 select
        id,
        argMax(user,updated_at) as user,
        argMax(user_id,updated_at) as user_id,
        argMax(salary,updated_at) as salary,
        argMax(created_at,updated_at) as created_at
  from salary
  group by id
  order by id asc;

最新记录👇:我们通过结果可以看到user =Jim,是工资有调整了,最开始的时候salary = 10000,目前的salary = 15000,通过argMax() 取到最新的记录,这个函数间接的实现了数据的updated 的功能,clickhouse 既可以查看历史的所有数据,又可以很好的查看最新的数据。

argMin()查看user最早记录:

sql 复制代码
  select
         id,
         argMin(user,updated_at) as user,
         argMin(user_id,updated_at) as user_id,
         argMin(salary,updated_at) as salary,
         argMin(created_at,updated_at) as created_at
  from salary
  group by id
  order by id asc;

业务场景三:获取user工资变化详情

想知道公司每个user 的最早期的工资和目前的薪资,以及涨幅和变化情况,根据员工表现合理安排员工的福利:

sql 复制代码
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;

注意

需要注意的是argMax() ,argMin() 函数的时候,如果有用上where 条件的时候,就要优先去一段时间范围的数据,然后嵌套后再做Where 条件的过滤哦;否则你符合你where过滤的条件的数据,不一定是最新的数据。

相关推荐
云姜.8 分钟前
线程和进程的关系
java·linux·jvm
是码龙不是码农10 分钟前
支付防重复下单|5 种幂等性设计方案(从初级到架构级)
java·架构·幂等性
曹牧10 分钟前
Spring Boot:如何在Java Controller中处理POST请求?
java·开发语言
heartbeat..11 分钟前
JVM 性能调优流程实战:从开发规范到生产应急排查
java·运维·jvm·性能优化·设计规范
WeiXiao_Hyy14 分钟前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
玄同76515 分钟前
SQLite + LLM:大模型应用落地的轻量级数据存储方案
jvm·数据库·人工智能·python·语言模型·sqlite·知识图谱
吾日三省吾码16 分钟前
别只会“加索引”了!这 3 个 PostgreSQL 反常识优化,能把性能和成本一起打下来
数据库·postgresql
chian-ocean18 分钟前
百万级图文检索实战:`ops-transformer` + 向量数据库构建语义搜索引擎
数据库·搜索引擎·transformer
苏渡苇20 分钟前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
团子的二进制世界27 分钟前
G1垃圾收集器是如何工作的?
java·jvm·算法