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.pswp.cn/web/14984.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14984.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14984.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode刷題之HOT100之二叉樹的直徑

2024/5/25 陰天。這幾天睡眠質量都非常好,一切似乎都在慢慢上升。先把題做了 1、題目描述 2、邏輯分析 題目要求就是給一個二叉樹,求出兩個節點之間的最大長度即為二叉樹的直徑。怎么做呢?我想不出來。看一下題解吧。題解給出的解法是深度優…

Swagger2 和 Swagger3 的不同

Swagger2 和 Swagger3 的不同 SpringBoot 整合 Swagger3 和 Swagger2 的主要區別如下&#xff1a; 區別一&#xff1a;引入不同的依賴 如果使用的是 Swagger 3 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter<…

Linux——Docker容器虛擬化平臺

安裝docker 安裝 Docker | Docker 從入門到實踐https://vuepress.mirror.docker-practice.com/install/ 不需要設置防火墻 docker命令說明 docker images #查看所有本地主機的鏡像 docker search 鏡像名 #搜索鏡像 docker pull 鏡像名 [標簽] #下載鏡像&…

學習java第八十天

ApplicationContext有哪些常見實現&#xff1f; FileSystemXmlApplicationContext容器從XML文件加載bean的定義。XML bean配置文件的完整路徑必須提供給構造函數。 ClassPathXmlApplicationContext容器也從XML文件加載bean的定義。這里&#xff0c;你需要正確設置classpath因…

mybatis-plus 優雅的寫service接口中方法(3)

多表聯查 上文講過了自定義sql &#xff0c;和wrapper的使用&#xff0c;但是我們可以發現 我們查詢的都是數據庫中的一張表&#xff0c;那么怎么進行多表聯查呢&#xff0c;當然也是用自定義sql來進行實現 比如說 查詢 id 為 1 2 4 的用戶 并且 地址在北京 的 用戶名稱 普…

Elasticsearch不刪原有jdk8導致的系列安裝和啟動問題

以前在空機器直接裝elasticsearch&#xff0c;沒有遇到什么問題。今天在現有JDK上安裝&#xff0c;遇到的問題記錄一下&#xff1a; 1. JDK的環境變量配置與我原有的不一致報如下錯誤&#xff1a; [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列數據的直方圖。 &#xff08;1&#xff09;源代碼&#xff1a; impo…

JavaScript異步編程:理解和使用Promise、Async/Await

JavaScript是一種單線程語言&#xff0c;這意味著它一次只能執行一個任務。然而&#xff0c;在Web開發中&#xff0c;我們經常需要處理異步操作&#xff0c;例如網絡請求、定時器、事件監聽等。JavaScript提供了多種方式來處理異步編程&#xff0c;包括回調函數、Promise、Asyn…

什么生信流程語言讓你極度爽?

生信流程搭建有多難&#xff1f;行業為解決這一問題提出了各種各樣的配方&#xff0c;有你熟悉的嗎&#xff1f; 一、困境 - 亂 無數機構投入大量人力物力&#xff0c;以期獲得一條條可用的生信流程。而有些流程&#xff0c;由于種種原因&#xff0c;存在著巨大的缺陷&#xf…

安全風險 - 切換后臺時背景模糊處理

因為安全風險中提到當app處于后臺卡片狀態時&#xff0c;顯示的卡片頁面應該為模糊效果&#xff0c;否則容易泄露用戶隱私&#xff0c;尤其當前頁涉及個人信息、資產信息等&#xff0c;都會造成信息泄露&#xff01;基于這種場景&#xff0c;我研究了下這種業務下的模糊效果 找…

普通函數的參數中的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 內部的操作&…

【OS】AUTOSAR Os是如何啟動第一個Task的

目錄 前言 正文 1.總體概覽及背景介紹 1.1. Os默認的Hook配置 1.2 用戶Task的配置

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 : […

第八屆“英拿科技杯”上海高校金馬程序設計聯賽暨東華大學邀請賽

第八屆“英拿科技杯”上海高校金馬程序設計聯賽暨東華大學邀請賽 儀表盤所有提交榜單 I. 孤星 單點時限: 2.0 sec 內存限制: 512 MB &#x1d45b;(1≤103) 個干員&#xff0c;每個干員工資為 &#x1d464;&#x1d456;(1≤&#x1d464;&#x1d456;≤105)&#xff0c;貢獻…

JAVA云HIS醫院系統源碼 HIS源碼:云HIS系統與SaaS的關系

云HIS系統與SaaS的關系 云HIS系統是一種基于云計算技術的醫院信息系統&#xff0c;它采用B/S架構&#xff0c;通過云端SaaS服務的方式提供。用戶可以通過瀏覽器訪問云HIS系統&#xff0c;無需關注系統的部署、維護、升級等問題。云HIS系統通常具有模板化、配置化、智能化等特點…

react記錄部署

導語 React中的核心概念 1 虛擬DOM&#xff08;Virtual DOM&#xff09; 2 Diff算法&#xff08;虛擬DOM的加速器&#xff0c;提升React性能的法寶&#xff09; React主要的原理 Virtual DOM 虛擬DOM; 提供了一種不同的而又強大的方式來更新DOM&#xff0c; 代替直接的DOM操…

cuda11.8安裝torch2.0.1

pip install torch2.0.1 torchvision0.15.2 torchaudio2.0.2 --index-url https://download.pytorch.org/whl/cu118

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.創建自定義線程…