ClickHouse函数应用——取最新一条数据

文章介绍了如何在数据库中创建测试数据表,用于存储用户ID及其手机号信息和变更记录。通过对比使用groupArray和argMax两种方法获取每个用户ID的最新手机号,强调了argMax在SQL逻辑简洁性和性能上的优势,适合处理大数据量的情况。
摘要由CSDN通过智能技术生成

一、创建测试数据

测试数据场景为各用户ID拥有手机号信息及变更记录。我们需要根据更新时间取各用户ID最新的手机号信息。

 CREATE TABLE default.row_number
             (
                 `user_id` String,
                 `user_phone` String,
                 `create_time` DateTime,
                 `update_time` DateTime
             )
             ENGINE = MergeTree
             ORDER BY user_id
             SETTINGS index_granularity = 8192;
insert into default.row_number values
             ('1','13234567891','2021-07-14 11:54:19','2021-07-14 11:54:19'),
             ('1','13234567890','2021-07-14 11:40:09','2021-07-14 11:40:09'),
             ('1','13234567892','2021-07-14 11:54:37','2021-07-14 11:54:37'),
             ('2','13234567894','2021-07-14 11:57:22','2021-07-14 11:57:22'),
             ('2','13234567893','2021-07-14 11:55:05','2021-07-14 11:55:05'),
             ('3','13234567896','2021-07-14 11:57:45','2021-07-14 11:57:45'),
             ('3','13234567895','2021-07-14 11:57:30','2021-07-14 11:57:30');

 二、groupArray

groupArray可以将字段放在一个数组里。groupArray(num)(x)中,num参数限制生成的数组含有的元素的个数。

select user_id, 
      groupArray(1)(user_phone) AS user_phone,
      groupArray(1)(create_time) AS create_time,
      groupArray(1)(update_time) AS update_time
 from (select user_id, 
              user_phone,
              create_time,
               update_time
         from default.row_number
        ORDER BY update_time desc
       ) a
group by user_id
order by user_id;

 注:这种方法存在弊端,数据量小时不影响结果输出准确性,但当数据量较大时可能出现异常情况,子查询未形成缓存表就执行了聚合函数。并且这种方法SQL逻辑较复杂,性能较差,耗内存。

三、argMax

argMax(arg,val):计算 ‘arg’ 最大值 ‘val’ 价值,argMin() 与argMax() 的功能正好是相反的,以下为官方示例:

 上图是argMin() 函数的简单案例,我们可以应用argMax函数对测试数据实现同样的效果。这种方法SQL逻辑更简单,性能更好。

select   user_id,
         argMax(user_phone,update_time) as phone,
         argMax(create_time,update_time) as time
  from  row_number
  group by user_id
  order by user_id;

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值