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'));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/14984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode刷题之HOT100之二叉树的直径

2024/5/25 阴天。这几天睡眠质量都非常好,一切似乎都在慢慢上升。先把题做了 1、题目描述 2、逻辑分析 题目要求就是给一个二叉树,求出两个节点之间的最大长度即为二叉树的直径。怎么做呢?我想不出来。看一下题解吧。题解给出的解法是深度优…

Linux——Docker容器虚拟化平台

安装docker 安装 Docker | Docker 从入门到实践https://vuepress.mirror.docker-practice.com/install/ 不需要设置防火墙 docker命令说明 docker images #查看所有本地主机的镜像 docker search 镜像名 #搜索镜像 docker pull 镜像名 [标签] #下载镜像&…

mybatis-plus 优雅的写service接口中方法(3)

多表联查 上文讲过了自定义sql ,和wrapper的使用,但是我们可以发现 我们查询的都是数据库中的一张表,那么怎么进行多表联查呢,当然也是用自定义sql来进行实现 比如说 查询 id 为 1 2 4 的用户 并且 地址在北京 的 用户名称 普…

Elasticsearch不删原有jdk8导致的系列安装和启动问题

以前在空机器直接装elasticsearch,没有遇到什么问题。今天在现有JDK上安装,遇到的问题记录一下: 1. JDK的环境变量配置与我原有的不一致报如下错误: [estestZK-DES-I root]$ /usr/elasticsearch/bin/elasticsearch could not fi…

python-数据分析与可视化基础

1、data1.csv中的B、C、D和E列数据分别是日期、权重、A企业的销售额、B企业的销售额。读取C、D、E列数据,并统计E列数据的算术平均数、加权平均值(权值为C列数据)、方差、中位数、最小值、最大值。并绘制E列数据的直方图。 (1)源代码: impo…

什么生信流程语言让你极度爽?

生信流程搭建有多难?行业为解决这一问题提出了各种各样的配方,有你熟悉的吗? 一、困境 - 乱 无数机构投入大量人力物力,以期获得一条条可用的生信流程。而有些流程,由于种种原因,存在着巨大的缺陷&#xf…

安全风险 - 切换后台时背景模糊处理

因为安全风险中提到当app处于后台卡片状态时,显示的卡片页面应该为模糊效果,否则容易泄露用户隐私,尤其当前页涉及个人信息、资产信息等,都会造成信息泄露!基于这种场景,我研究了下这种业务下的模糊效果 找…

普通函数的参数中的auto

2.1 普通函数的参数中的auto 从c14起&#xff0c;lambda可以使用auto占位符声明或者定义参数: auto printColl [] (const auto& coll) // generic lambda{ for (const auto& elem : coll) {std::cout << elem << \n;}} 只要支持Lambda 内部的操作&…

Golang创建文件夹

方法 package zdpgo_fileimport ("os" )// AddDir 创建文件夹 func AddDir(dir string) error {if !IsExist(dir) {return os.MkdirAll(dir, os.ModePerm)}return nil }测试 package zdpgo_fileimport "testing"func TestAddDir(t *testing.T) {data : […

JAVA云HIS医院系统源码 HIS源码:云HIS系统与SaaS的关系

云HIS系统与SaaS的关系 云HIS系统是一种基于云计算技术的医院信息系统&#xff0c;它采用B/S架构&#xff0c;通过云端SaaS服务的方式提供。用户可以通过浏览器访问云HIS系统&#xff0c;无需关注系统的部署、维护、升级等问题。云HIS系统通常具有模板化、配置化、智能化等特点…

hot100 -- 回溯(上)

目录 &#x1f35e;科普 &#x1f33c;全排列 AC DFS &#x1f6a9;子集 AC DFS &#x1f382;电话号码的字母组合 AC DFS &#x1f33c;组合总和 AC DFS &#x1f35e;科普 忘记 dfs 的&#xff0c;先看看这个&#x1f447; DFS&#xff08;深度优先搜索&#xf…

百度软件测试面试经历,期望薪资27K

一面 1、 请为百度搜索框设计测试用例&#xff1f; 2、百度设计框上线前需要进行那些测试&#xff1f; 界面测试&#xff0c;功能测试&#xff0c;性能测试&#xff0c;安全性测试&#xff0c;易用性测试&#xff0c;兼容性测试&#xff0c;UI测试。 3、如何查看http状态码…

重学java 38.创建线程的方式⭐

It is during our darkest moments that we must focus to see the light —— 24.5.24 一、第一种方式_继承extends Thread方法 1.定义一个类,继承Thread 2.重写run方法,在run方法中设置线程任务(所谓的线程任务指的是此线程要干的具体的事儿,具体执行的代码) 3.创建自定义线程…

基于灰狼优化算法优化支持向量机(GWO-SVM)回归预测

代码原理 基于灰狼优化算法优化支持向量机&#xff08;GWO-SVM&#xff09;的回归预测代码的原理和流程如下&#xff1a; 1. **初始化灰狼群体**&#xff1a;随机生成一定数量的灰狼&#xff0c;并初始化它们的位置和速度。 2. **初始化SVM模型参数**&#xff1a;根据问题要…

【JAVA基础之网络编程】UDP和TCP协议以及三次握手和四次挥手的过程

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 目录 1. 网络编程 1.1 概述 1.2 网络编程的三要素 1.2.1 IP地址 1.2.2 InetAddress 1.2.3 端口和协议 1.3 UDP协议 1.3.1 UDP发送数据 1.3.2 UDP接收数据 1.4…

C语言——小知识和小细节18

一、力扣题目 1、题目本体 2、题解 本题目我们使用异或分组的方法来解决。可以在我之前的文章《C语言——操作符CSDN博客》中看一下异或的特点。 由于异或的运算规则为相同为0&#xff0c;不同为1&#xff0c;而且是在二进制补码上进行操作的&#xff0c;我们可以发现的一个…

c++|多态

c|多态 1 多态的概念2 多态的定义及其实现2.1 满足多态的条件2.2 虚函数2.3 虚函数的重写2.4 析构函数适合加virtural吗2.4 C11 override 和 final2.5 三个概念的对比 3 多态的原理4 抽象类4.1 概念4.2 纯虚函数 1 多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是…

【再探】设计模式—代理模式

代理是指授权代理人在一定范围内代表其向第三方进行处理有关事务。 1 代理模式 需求&#xff1a;1&#xff09;将业务代码与非业务代码分离&#xff0c;在不改变代码结构的基础上&#xff0c;为其添加新的功能。2&#xff09;为系统中的某些操作做同一处理&#xff0c;例如进…

[实例] Unity Shader 逐像素漫反射与半兰伯特光照

漫反射光照是Unity中最基本最简单的光照模型&#xff0c;本篇将会介绍在片元着色器中实现反射效果&#xff0c;并会采用半兰伯特光照技术对其进行改进。 1. 逐顶点光照与逐像素光照 在Unity Shader中&#xff0c;我们可以有两个地方可以用来计算光照&#xff1a;在顶点着色器…

z3-加法器实验

补码器加减法&#xff0c;运算方法简介 我们要知道什么是补码的加法&#xff0c;我们为什么要用补码的加法&#xff1f; 补码的加法其实就是将两个补码形式的二进制数字直接相加&#xff0c;处理的时候忽略超出固定位数的进位。补码的加法运算和无符号二进制数的加法操作一样&…