clickhouse分组排序,行号,取特定数量数据

这篇具有很好参考价值的文章主要介绍了clickhouse分组排序,行号,取特定数量数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目前应用很多需求设计对数据分组并去特定数量的数据;
clickhouse 新版本增加了row_number(),rank() 函数,可以直接对分组数据添加行号;下面是记录了这两个函数的基本使用;另外用 groupArray方式也大概实现了添加行号(官网上有说 groupArrayLast 可以实现自动排序的功能),但是实测这函数没法使用,所以暂不记录;

1、源数据

select 'a' as name, 25 as age,165 as height union all
select 'b' as name, 21 as age,182 as height union all
select 'a' as name, 21 as age,187 as height union all
select 'a' as name, 25 as age,158 as height union all
select 'b' as name, 22 as age,168 as height

2、生成数组

2.1 groupArray 分组合并为数组

groupArray 会把同类型的值合并为数组,并过滤NULL值数据;格式groupArray(max_size)(fields)

-- 不限制分组数量
select name,groupArray(age) from 
(select 'a' as name, 25 as age,165 as height union all 
 select 'b' as name, 21 as age,182 as height union all 
 select 'a' as name, 21 as age,187 as height union all 
 select 'a' as name, 25 as age,158 as height union all 
 select 'b' as name, 22 as age,168 as height
) a group by name;
name groupArray(age)
b [21,22]
a [25,21,25]
-- 限制分组数量为1
-- 如果先对内部数据排序再分组可拿取age最大的一条
-- arrayStringConcat 将数据用特定字符合并
select name,groupArray(1)(age),arrayStringConcat(groupArray(1)(age),'') from 
(select * from 
 (select 'a' as name, 25 as age,165 as height union all 
  select 'b' as name, 21 as age,182 as height union all 
  select 'a' as name, 21 as age,187 as height union all 
  select 'a' as name, 25 as age,158 as height union all 
  select 'b' as name, 22 as age,168 as height
 ) a  
 order by age desc 
) r group by name;
name groupArray(1)(age) arrayStringConcat(groupArray(1)(age),‘’)
b [22] 22
a [25] 25
2.2 arrayEnumerate 标记数据
select name,groupArray(age) as values,arrayEnumerate(values) as indexs from 
(select 'a' as name, 25 as age,165 as height union all 
 select 'b' as name, 21 as age,182 as height union all 
 select 'a' as name, 21 as age,187 as height union all 
 select 'a' as name, 25 as age,158 as height union all 
 select 'b' as name, 22 as age,168 as height
) a group by name;
name values indexs
b [21,22] [1,2]
a [25,21,25] [1,2,3]

3、rank()、row_number()

3.1 说明

https://clickhouse.com/docs/en/sql-reference/window-functions

3.2 使用
--rank()
select name,age,rank() over(partition by name order by age asc ) from 
(select 'a' as name, 25 as age,165 as height union all 
 select 'b' as name, 21 as age,182 as height union all 
 select 'a' as name, 21 as age,187 as height union all 
 select 'a' as name, 25 as age,158 as height union all 
 select 'b' as name, 22 as age,168 as height
) a group by name,age;

-- row_number()
select name,age,row_number() over(partition by name order by age asc ) from 
(select 'a' as name, 25 as age,165 as height union all 
 select 'b' as name, 21 as age,182 as height union all 
 select 'a' as name, 21 as age,187 as height union all 
 select 'a' as name, 25 as age,158 as height union all 
 select 'b' as name, 22 as age,168 as height
) a group by name,age;
name age rank() OVER (PARTITION BY name ORDER BY age ASC)
a 21 1
a 25 2
b 21 1
b 22 2

PS. 行号已经标明,后续需要取多少数据设置行号条件即可文章来源地址https://www.toymoban.com/news/detail-732063.html

到了这里,关于clickhouse分组排序,行号,取特定数量数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用SQL sever SSMS工具向数据库特定表中导入数据

    1、打开SQL sever,点击连接  2、把要导入的xls文件存放在一个文件夹中  3、找到要导入的表对应的数据库  4、选中数据库,右键选择任务——导入数据 5、弹出导入和导出向导,数据源选择Microsoft Excel,点击浏览选择文件途径,之后点击下一步  6、目标一定要选择Microsoft OLE

    2024年02月07日
    浏览(47)
  • 分组排序取第一条数据 SQL写法

    在数据库查询过程中经常遇到需要分组排序查询第一条数据的情况。例如,在消息列表中需要展示每个联系人最近的一条信息。 目前我接触到的解决方案有两种,分别是开窗函数 row_number 和变量法。 比较常用的解决方案是使用开窗函数 row_number() over(partition by xxx order by xxx)

    2024年04月25日
    浏览(31)
  • ClickHouse性能调优之排序和数据类型

    每个DBA都关心数据库性能调优,我们知道不同数据类型可以描述不能业务场景,同时也影响数据访问和有效存储。ClickHoue支持高级压缩算法提升速度和降低存储成本,优化ClickHoue存储架构提升内存和网络带宽的性能。那我们如何选择压缩算法和数据类型呢? 创建表并指定排序

    2024年02月10日
    浏览(43)
  • 【Sql】根据字段分组排序,取其第一条数据

    (1)问题描述 有时候我们需要对数据进行去重处理,例如查询结果里的文件名有重复,我们希望可以按照创建时间排序,最终结果里每个文件名只取创建时间最近的一个。 (2)有哪些问题 想到去重,可以想到使用distinct或者group by分组。但是这两者有个问题,例如我们查询

    2024年02月16日
    浏览(31)
  • 【数据库学习】ClickHouse(ck)

    是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。 按列存储,列越多速度越慢; 按列存储,数据更容易压缩(类型相同、区分度);==》每次读取的数据就更多,更少的io。 聚合性能高; 类sql操作;仅支持数据的查询、批量写入、批量删除。 用于磁盘查询,同时也利用

    2024年02月02日
    浏览(55)
  • Ubuntu安装clickhouse数据库

    目录 1、更新包列表  2、运行安装脚本 3、设置密码 4、启动服务 5、测试连接 6、下载官方测试数据         1、下载数据集直接执行以下代码          2、创建数据库         3、创建数据表(1)         4、创建数据表(2)         5、导入数据 7、测试查询  8、远程连接

    2024年02月02日
    浏览(46)
  • 大数据ClickHouse(五):数据库引擎介绍与实例演示

    文章目录 数据库引擎介绍与实例演示 一、Ordinary默认数据库引擎 二、MySQL数据库引擎

    2024年02月03日
    浏览(48)
  • ClickHouse与Doris数据库比较

    都说“实践是检验真理的唯一标准”,光说不练假把式,那么本文就通过实际的测试来感受一下Doris和clickhouse在读写方面的性能差距,看看Doris盛名之下,是否真有屠龙之技;clickhouse长锋出鞘,是否敢缚苍龙? 废话不多说,上货。 在这里,我使用多台物理机搭建了clickhouse和

    2024年01月22日
    浏览(48)
  • Java中用Stream分组并求各组数量

    比如给了我一个班级的所有人的姓氏和姓名对象集合,根据这个集合求出各姓氏有多少人。直接上代码。 User的实体类对象为 输出的结果为:   即姓张的有3个,姓李的有两个。 详解: 将该集合的stream流用Collectors对象转成Map,用User对象的firstName作为Key,默认键值为1,在处

    2024年02月12日
    浏览(41)
  • Java List集合去重、过滤、分组、获取数据、求最值、合并、排序、跳数据和遍历

    请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i、 使用stream().map()提取List对象的某一列值及去重 使用 findAny() 和 findFirst() 获取第一条数据 我是南国以南i记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!! 参考链接、参考链接

    2024年04月11日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包