当前位置: 首页 > news >正文

clickhouse 中的数组(array)和元组(Tuple)—— clickhouse 基础篇(二)

文章目录

  • 数组
    • 判断是否为空
    • 计算数组长度
    • 获取数组元素
    • 判断某个元素是否存在
    • 数组切片
    • 数组元素展开
    • 数组元素去重
    • 删除连续重复元素
    • 连接多个数组
    • 数组倒序
    • 数组拍平
    • 数组元素映射
    • 数组元素过滤
    • 数组聚合分析
    • 计算数组交集
    • 计算数组并集
    • 计算数组差集
    • SQL 子查询进行集合操作
  • 元组
    • 创建元组
    • 获取元组中的元素
    • 插入元组元素

数组

数组中的数据类型

  • 数组中的每一个元素都是同一种数据,在一个数组中创建使用不同数据类型,会报错。
  • 当数组中的元素都不为空时,数组类型就是不可空的。
  • 如果数组中元素有一个NULL(空值),类型会相应地变成可空元素类型。

判断是否为空

SELECTempty([]) AS isEmpty,empty([1]) AS notEmpty
FORMAT Vertical# 输出
isEmpty: 1
notEmpty: 0

计算数组长度

SELECTlength([1,2,3]) AS a1,length([]) AS a2,length(NULL) AS a3
FORMAT Vertical# 输出
a1: 3
a2: 0
a3: NULL

获取数组元素

clickhouse 数组元素通过索引访问,索引从1开始。
image.png

判断某个元素是否存在

SELECT has([1,2,3], 1) AS hasIt###############
┌─hasIt─┐
│     1 │
└───────┘

数组切片

参数说明:

  • 数组
  • 偏移量,正数从左边开始,负数从右边开始,需要注意clickhouse 索引下标从1开始
  • 数组长度
SELECTarraySlice([10, 20, 30, 40, 50], 1, 2) AS res1,arraySlice([10, 20, 30, 40, 50], 1) AS res2
FORMAT Vertical################
res1: [10,20]
res2: [10,20,30,40,50]

数组元素展开

将数组中的元素展开至多行

SELECT arrayJoin([1,2,3])###############
┌─arrayJoin([1, 2, 3])─┐
│                    1 │
│                    2 │
│                    3 │
└──────────────────────┘

数组元素去重

SELECT arrayDistinct([1,1,nan,nan,2,3,3,3,NULL,NULL,3,4,5,6,6,6]) as c
FORMAT Vertical#######################
c: [1,nan,2,3,4,5,6]

删除连续重复元素

SELECT arrayCompact([1,1,nan,nan,2,3,3,3,NULL,NULL,3,4,5,6,6,6]) AS c
FORMAT Vertical####################
c: [1,nan,2,3,NULL,3,4,5,6]

连接多个数组

SELECT arrayConcat([1,2], [3,4], [5,6,3,4]) as res#######################
┌─res───────────────┐
│ [1,2,3,4,5,6,3,4] │
└───────────────────┘

数组倒序

SELECT arrayReverse([1,2,3]) as res################
┌─res─────┐
│ [3,2,1] │
└─────────┘

数组拍平

SELECT arrayFlatten([[[1]], [[2], [3,4,5]]] AS src) AS flatArr, src
FORMAT Vertical######################
flatArr: [1,2,3,4,5]
src:     [[[1]],[[2],[3,4,5]]]

数组元素映射

SELECT arrayMap(x -> (x*x), [1,2,3]) AS res
FORMAT Vertical#####################
res: [1,4,9]

数组元素过滤

SELECT arrayFilter(x -> ((x%2) = 0), [1,2,3,4,5,6]) AS res
FORMAT Vertical#############
res: [2,4,6]

数组聚合分析

将数组中的元素放入聚合函数执行,并返回结果,需要注意函数参数使用单引号

SELECT arrayReduce('max', [1,2,3,3,4,4]) as res##################
┌─res─┐
│   4 │
└─────┘SELECT arrayReduce('sum', [1,2,3,3,4,4]) as res#############
┌─res─┐
│  17 │
└─────┘

计算数组交集

SELECT arrayIntersect([1,2,3,3], [4,5,6]) AS noIntersect,arrayIntersect([1,2,3,3], [3,4,5,6]) AS hasIntersect
FORMAT Vertical##################
noIntersect:  []
hasIntersect: [3]

计算数组并集

SELECT [1,2] AS a,[2,3] AS b,arrayDistinct(arrayConcat(a,b)) AS res
FORMAT Vertical##################
a:   [1,2]
b:   [2,3]
res: [1,2,3]

计算数组差集

需要结合 arrayIntersect 和 arrayMap 和 arrayFilter 组合实现。

SELECT [1,2] AS a,[2,3] AS b,arrayFilter(x -> (x IS NOT NULL), arrayMap(x -> multiIf(x NOT IN arrayIntersect(a,b), x, NULL), a)) AS res
FORMAT Vertical##################
a:   [1,2]
b:   [2,3]
res: [1]

SQL 子查询进行集合操作

交集SQL

SELECT a.i
FROM
(SELECT arrayJoin([1,2]) AS i
) AS a
INTERSECT
SELECT b.i
FROM
(SELECT arrayJoin([2,3]) AS i
) AS b####################
┌─i─┐
│ 2 │
└───┘

并集 SQL

SET union_default_mode = 'ALL';SELECT DISTINCT t.i
FROM
(SELECT a.iFROM(SELECT arrayJoin([1,2]) AS i) AS aUNIONSELECT b.iFROM (SELECT arrayJoin([2,3]) AS i)AS b
) AS t########################
┌─i─┐
│ 2 │
│ 3 │
└───┘
┌─i─┐
│ 1 │
└───┘

差集 SQL

SELECT a.i
FROM
(SELECT arrayJoin([1,2]) AS i
) AS a
EXCEPT
SELECT b.i
FROM
(SELECT arrayJoin([2,3]) AS i
) AS b########################
┌─i─┐
│ 1 │
└───┘

元组

元组中的数据类型说明

  • 不同于数组中的每个元素类型要一样,元组中的元素类型可以不一样
  • 元组一般表示列的聚合,SQL 中的 in 查询也是使用的元组
  • 在 clickhouse 中元组也可以作为查询的结果

创建元组

SELECT tuple(1, 'a', NULL) AS x, toTypeName(x) as tp FORMAT Vertical;SELECT (1, 'a', NULL) AS x, toTypeName(x) as tp FORMAT Vertical;

获取元组中的元素

元组和数组一样,元素索引都是从1开始。

select (1, 'a', 3, 4) as tp1, tupleElement(tp1, 2) as t2 Format Vertical;
# 等价于
select (1, 'a', 3, 4) as tp1, tp1.2 as t2 Format Vertical;################
tp1: (1,'a',3,4)
t2:  a

获取元组中的每个元素:

select (1, 'a', 3, 4) as tp1, untuple(tp1) as t2 Format Vertical;#####################
tp1:  (1,'a',3,4)
t2.1: 1
t2.2: a
t2.3: 3
t2.4: 4

插入元组元素

CREATE TABLE t1
(`a` Date,`b` UInt8,`c` Tuple(UInt8, String)
)
Engine = MergeTree(a, b, 8192);insert into t1(a, b, c) values(now(), 1, (1, 'a'));

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • STM32_ADC
  • 两种单例模式的区别
  • 【简明指南:Python中的异常处理与稳健代码设计】
  • 限流及限流算法
  • powershell脚本批量拉取 git仓库文件
  • 老外卖27刀每月的教程已经更新
  • c# sqlite使用
  • vue2 自定义指令
  • OpenAI模型GPT-4o、GPT-4、Gemini 1.5性能比较
  • R实验 方差分析
  • 【运维项目经历|024】MySQL性能优化与监控平台
  • 神奇动物在哪里?斯洛文尼亚旅游之野生动物寻踪
  • 2024年郫都区区级农业生产社会化服务重点服务组织评定申报条件材料、程序要求
  • Python筑基之旅-MySQL数据库(四)
  • Java+IDEA+SpringBoot药物不良反应ADR智能监测系统源码 ADR智能化监测系统源码
  • 77. Combinations
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Apache Pulsar 2.1 重磅发布
  • ECMAScript6(0):ES6简明参考手册
  • github指令
  • java8-模拟hadoop
  • Laravel核心解读--Facades
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Python连接Oracle
  • Rancher如何对接Ceph-RBD块存储
  • select2 取值 遍历 设置默认值
  • 百度小程序遇到的问题
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 检测对象或数组
  • 普通函数和构造函数的区别
  • 如何在GitHub上创建个人博客
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 物联网链路协议
  • 一、python与pycharm的安装
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​数据链路层——流量控制可靠传输机制 ​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # 透过事物看本质的能力怎么培养?
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (007)XHTML文档之标题——h1~h6
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (3) cmake编译多个cpp文件
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (初研) Sentence-embedding fine-tune notebook
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (过滤器)Filter和(监听器)listener
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)http-server应用
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!