ClickHouse基于数据分析常用函数

文章标题

  • 一、WITH语法-定义变量
    • 1.1 定义变量
    • 1.2 调用函数
    • 1.3 子查询
  • 二、GROUP BY子句(结合WITH ROLLUP、CUBE、TOTALS)
  • 三、FORM语法
    • 3.1表函数
      • 3.1.1 file
      • 3.1.2 numbers
      • 3.1.3 mysql
      • 3.1.4 hdfs
  • 四、ARRAY JOIN语法(区别于arrayJoin(arr)函数)
  • 五、连续销售案例
  • 六、连接函数
    • 6.1 连接精度
      • 6.1.1 ALL
      • 6.1.2 ANY
      • 6.1.3 ASOF
  • 七、系统函数介绍
  • 八、JSON解析案例
  • 九、实用函数
  • 十、语法注意事项

背景:基于初次接触数据分析,对ck函数的不熟悉,此文章主要基于ck特有的sql语法来做讲解;
官网:https://clickhouse.tech/docs/zh

一、WITH语法-定义变量

ClickHouse支持CTE(Common Table Expression,公共表达式),以增强查询语句的表达

SELECT pow(2, 2);┌─pow(2, 2)─┐
│         4 │
└───────────┘SELECT pow(pow(2, 2), 2);┌─pow(pow(2, 2), 2)─┐
│                16 │
└───────────────────┘

在改用CTE的形式后,可以极大地提高语句的可读性和维护性。

WITHpow(2, 2) AS a
SELECT pow(a, 2);┌─pow(a, 2)─┐
│        16 │
└───────────┘

1.1 定义变量

可以定义变量,这些变量能够在后续的查询子句中被直接访问。

# tb_mysql- 创建数据
DROP TABLE IF EXISTS tb_mysql;
CREATE TABLE tb_mysql (id UInt8,name String,age UInt8
)ENGINE = MergeTree()
ORDER BY id;
INSERT INTO tb_mysql VALUES ('1', 'tom', 23);
INSERT INTO tb_mysql VALUES ('2', 'lisa', 33);
INSERT INTO tb_mysql VALUES ('3', 'henry', 44);
INSERT INTO tb_mysql VALUES ('1', 'linda', 23);
INSERT INTO tb_mysql VALUES ('2', 'ross', 33);
INSERT INTO tb_mysql VALUES ('1', 'julie', 23);
INSERT INTO tb_mysql VALUES ('2', 'niki', 33);# 数据分析
WITH 1  AS constant
SELECTid + constant,name
FROMtb_mysql;┌─plus(id, constant)─┬─name─┐
│                  3 │ niki │
└────────────────────┴──────┘
┌─plus(id, constant)─┬─name──┐
│                  2 │ tom   │
│                  2 │ linda │
│                  2 │ julie │
│                  3 │ lisa  │
│                  3 │ ross  │
│                  4 │ henry │
└────────────────────┴───────┘

1.2 调用函数

可以访问SELECT子句中的列字段,并调用函数做进一步的加工处理

# tb_partition-创造数据
DROP TABLE IF EXISTS tb_partition;
CREATE TABLE tb_partition (id UInt8,name String,birthday String
)ENGINE = MergeTree()
ORDER BY id;
INSERT INTO tb_partition VALUES ('1', 'x1', '2024-05-20 10:50:46');
INSERT INTO tb_partition VALUES ('2', 'xy', '2024-05-20 11:17:47');
INSERT INTO tb_partition VALUES ('3', 'xf', '2024-05-19 11:11:12');# 数据分析
WITH toDate(birthday) AS bday
SELECTid,name,bday
FROMtb_partition;┌─id─┬─name─┬───────bday─┐
│  1 │ x1   │ 2024-05-20 │
└────┴──────┴────────────┘
┌─id─┬─name─┬───────bday─┐
│  2 │ xy   │ 2024-05-20 │
└────┴──────┴────────────┘
┌─id─┬─name─┬───────bday─┐
│  3 │ xf   │ 2024-05-19 │
└────┴──────┴────────────┘

1.3 子查询

可以定义子查询,在WITH中使用子查询时有一点需要特别注意,该查询语句只能 返回一行数据,如果结果集的数据大于一行则会抛出异常;

WITH (SELECT *FROM tb_partitionWHERE tb_partition.id = '1') AS sub
SELECT* ,sub
FROM tb_partition;┌─id─┬─name─┬─birthday────────────┬─sub────────────────────────────┐
│  3 │ xf   │ 2024-05-19 11:11:12(1,'x1','2024-05-20 10:50:46') │
└────┴──────┴─────────────────────┴────────────────────────────────┘
┌─id─┬─name─┬─birthday────────────┬─sub────────────────────────────┐
│  2 │ xy   │ 2024-05-20 11:17:47(1,'x1','2024-05-20 10:50:46') │
└────┴──────┴─────────────────────┴────────────────────────────────┘
┌─id─┬─name─┬─birthday────────────┬─sub────────────────────────────┐
│  1 │ x1   │ 2024-05-20 10:50:46(1,'x1','2024-05-20 10:50:46') │
└────┴──────┴─────────────────────┴────────────────────────────────┘

二、GROUP BY子句(结合WITH ROLLUP、CUBE、TOTALS)

  • ROLLUP:能够按照聚合键从右向左上卷数据,基于聚 合函数依次生成分组小计和总计。如果设聚合键的个数为n,则最终 会生成小计的个数为n+1
  • CUBE:像立方体模型一样,基于聚合键之间所有的 组合生成小计信息。如果设聚合键的个数为n,则最终小计组合的个 数为2的n次方。接下来用示例说明它的用法
  • TOTALS:会基于聚合函数对所有数据进行总计
# tb_with-创建数据
DROP TABLE IF EXISTS tb_with;
CREATE TABLE tb_with (id UInt8,vist UInt8,province String,city String,area String
)ENGINE = MergeTree()
ORDER BY id;
INSERT INTO tb_with VALUES (1, 12 ,'湖北', '黄冈', '武穴');
INSERT INTO tb_with VALUES (2, 12 ,'湖北', '黄冈', '黄州');
INSERT INTO tb_with VALUES (3, 12 ,'湖北', '黄冈', '麻城');
INSERT INTO tb_with VALUES (4, 32 ,'湖北', '黄冈', '黄梅');
INSERT INTO tb_with VALUES (5, 12 ,'湖北', '黄石', '下陆');
INSERT INTO tb_with VALUES (6, 54 ,'湖北', '黄石', '铁山');
INSERT INTO tb_with VALUES (7, 12 ,'湖北', '黄石', '石灰窑');
INSERT INTO tb_with VALUES (8, 89 ,'湖北', '荆州', '荆门');
INSERT INTO tb_with VALUES (9, 99 ,'湖北', '荆州', '钟祥');# 数据分析
SELECT province,city,area,sum(vist) AS total_visit
FROM tb_with
GROUP BY province, city, area WITH ROLLUP ;┌─province─┬─city─┬─area───┬─total_visit─┐
│ 湖北     │ 黄冈 │ 黄梅   │          32 │
│ 湖北     │ 荆州 │ 钟祥   │          99 │
│ 湖北     │ 黄冈 │ 麻城   │          12 │
│ 湖北     │ 荆州 │ 荆门   │          89 │
│ 湖北     │ 黄冈 │ 黄州   │          12 │
│ 湖北     │ 黄石 │ 下陆   │          12 │
│ 湖北     │ 黄石 │ 石灰窑 │          12 │
│ 湖北     │ 黄石 │ 铁山   │          54 │
│ 湖北     │ 黄冈 │ 武穴   │          12 │
└──────────┴──────┴────────┴─────────────┘
┌─province─┬─city─┬─area─┬─total_visit─┐
│ 湖北     │ 黄石 │      │          78 │
│ 湖北     │ 荆州 │      │         188 │
│ 湖北     │ 黄冈 │      │          68 │
└──────────┴──────┴──────┴─────────────┘
┌─province─┬─city─┬─area─┬─total_visit─┐
│ 湖北     │      │      │         334 │
└──────────┴──────┴──────┴─────────────┘
┌─province─┬─city─┬─area─┬─total_visit─┐
│          │      │      │         334 │
└──────────┴──────┴──────┴─────────────┘

三、FORM语法

SQL是一种面向集合的编程语言,from决定了程序从那里读取数据

  1. 表中查询数据
  2. 子查询中查询数据
  3. 表函数中查询数据 select * from numbers(3)

3.1表函数

构建表的函数,使用场景如下:
SELECT查询的(FROM)子句
创建表 AS 查询

请添加图片描述

3.1.1 file

请添加图片描述

-- 数据文件必须在指定的目录下 /var/lib/clickhouse/user_filesSELECT *
FROM file('demo.csv', 'CSV', 'id Int8,name String, age UInt8')
-- 文件夹下任意的文件
SELECT*
FROM file('*', 'CSV', 'id Int8, name String, age UInt8')

3.1.2 numbers

-- numbers(N) – 返回一个包含单个 ‘number’ 列(UInt64)的表,其中包含从0到N-1的整数。
-- numbers(N, M) - 返回一个包含单个 ‘number’ 列(UInt64)的表,其中包含从N到(N+M-1)的整数。
SELECT *
FROM numbers(10);SELECT *
FROM numbers(2, 10);SELECT *
FROM numbers(2, 10) 
LIMIT 3;SELECT toDate('2020-01-01') + number AS d
FROM 
numbers(365);

3.1.3 mysql

-- CH可以直接从mysql服务中查询数据
mysql('host:port', 'database', 'table', 'user', 'password'[, replace_query, 'on_duplicate_clause']);SELECT*
FROM mysql('linux01:3306', 'db_doit_ch', 'emp', 'root', 'root');

请添加图片描述

3.1.4 hdfs

SELECT *
FROMhdfs('hdfs://hdfs1:9000/test', 'TSV', 'column1 UInt32, column2 UInt32') 
LIMIT 2;SELECT*
FROMhdfs('hdfs://linux01:8020/demo.csv', 'CSV', 'id Int8, name String, age Int8')

请添加图片描述

四、ARRAY JOIN语法(区别于arrayJoin(arr)函数)

ARRAY JOIN子句允许在数据表的内部,与数组或嵌套类型的字段进行JOIN操作,从而将一行数组展开为多行,类似于hive中的explode炸裂函数的功能

# ARRAY JOIN-创建数据
DROP TABLE IF EXISTS tb_array_join;
CREATE TABLE tb_array_join (id Int8,hobby Array(String)
)ENGINE = Log;INSERT INTO tb_array_join VALUES (1, ['eat', 'drink', 'sleep']), (2, ['study', 'sport', 'read']), (2, ['study', 'sport']);# 查询数据
SELECT * FROM tb_array_join;
┌─id─┬─hobby────────────────────┐
│  1['eat','drink','sleep']  │
│  2['study','sport','read'] │
│  2['study','sport']        │
└────┴──────────────────────────┘# 分析1
SELECTid,hobby,hobby_expand
FROMtb_array_join
ARRAY JOIN
hobby AS hobby_expand;
┌─id─┬─hobby────────────────────┬─hobby_expand─┐
│  1['eat','drink','sleep']  │ eat          │
│  1['eat','drink','sleep']  │ drink        │
│  1['eat','drink','sleep']  │ sleep        │
│  2['study','sport','read'] │ study        │
│  2['study','sport','read'] │ sport        │
│  2['study','sport','read']read         │
│  2['study','sport']        │ study        │
│  2['study','sport']        │ sport        │
└────┴──────────────────────────┴──────────────┘# 分析2
SELECTid,hobby,arrayEnumerate(hobby) AS indexs
FROMtb_array_join;
┌─id─┬─hobby────────────────────┬─indexs──┐
│  1['eat','drink','sleep'][1,2,3] │
│  2['study','sport','read'][1,2,3] │
│  2['study','sport'][1,2]   │
└────┴──────────────────────────┴─────────┘# 分析3(将hobby展开,并与索引组成一列)
SELECTid,hobby_expand,index
FROMtb_array_join
ARRAY JOIN
hobby AS hobby_expand,
arrayEnumerate(hobby) AS index;┌─id─┬─hobby_expand─┬─index─┐
│  1 │ eat          │     1 │
│  1 │ drink        │     2 │
│  1 │ sleep        │     3 │
│  2 │ study        │     1 │
│  2 │ sport        │     2 │
│  2read3 │
│  2 │ study        │     1 │
│  2 │ sport        │     2 │
└────┴──────────────┴───────┘

五、连续销售案例

需求:对如下样本数据求每个店铺最高连续n天的销售情况

# tb_shop-创建数据
# 思路:
# 1、按照name和cdate排序;
# 2、对name和cdate相同的数据只保留一个,按此业务所以保留每天最大的营销额
# 基于上述需求,所以用ReplacingMergeTree引擎实现
# 3、然后基于下方的分析步骤进行逐步分析
DROP TABLE IF EXISTS tb_shop;
CREATE TABLE tb_shop (name String,cdate Date,cost Float64
)ENGINE = ReplacingMergeTree()
ORDER BY (name, cdate);
INSERT INTO tb_shop VALUES ('a', '2024-02-05', 200),
('a', '2024-02-04', 320),
('a', '2024-02-03', 260),
('a', '2024-01-29', 300),
('a', '2024-01-29', 230),
('a', '2024-01-28', 880),
('a', '2024-01-27', 900),
('a', '2024-01-26', 350),
('a', '2024-01-26', 500),
('a', '2024-01-26', 900),('b', '2024-02-05', 200),
('b', '2024-02-04', 320),
('b', '2024-02-03', 260),
('b', '2024-02-02', 670),('c', '2024-02-05', 200),
('c', '2024-02-05', 900),
('c', '2024-02-05', 800),
('c', '2024-02-05', 200);# 按照以下sql一步步排查
# 分析1
SELECT name,groupArray(cdate) AS arr
FROMtb_shop
GROUP BY name;
┌─name─┬─arr──────────────────────────────────────────────────────────────────────────────────────────┐
│ b    │ ['2024-02-02','2024-02-03','2024-02-04','2024-02-05']                                        │
│ c    │ ['2024-02-05']                                                                               │
│ a    │ ['2024-01-26','2024-01-27','2024-01-28','2024-01-29','2024-02-03','2024-02-04','2024-02-05'] │
└──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘# 分析2
SELECTname,ct,arr_index
FROM(SELECTname,groupArray(cdate) AS arr,arrayEnumerate(arr) AS idxFROMtb_shopGROUP BY name)
ARRAY JOIN
arr AS ct,
idx AS arr_index;
┌─name─┬─────────ct─┬─arr_index─┐
│ b    │ 2024-02-021 │
│ b    │ 2024-02-032 │
│ b    │ 2024-02-043 │
│ b    │ 2024-02-054 │
│ c    │ 2024-02-051 │
│ a    │ 2024-01-261 │
│ a    │ 2024-01-272 │
│ a    │ 2024-01-283 │
│ a    │ 2024-01-294 │
│ a    │ 2024-02-035 │
│ a    │ 2024-02-046 │
│ a    │ 2024-02-057 │
└──────┴────────────┴───────────┘# 分析3
SELECTname,(ct - arr_index) AS diff
FROM(SELECTname,groupArray(cdate) AS arr,arrayEnumerate(arr) AS idxFROMtb_shopGROUP BY name)
ARRAY JOIN
arr AS ct,
idx AS arr_index;
┌─name─┬───────diff─┐
│ b    │ 2024-02-01 │
│ b    │ 2024-02-01 │
│ b    │ 2024-02-01 │
│ b    │ 2024-02-01 │
│ c    │ 2024-02-04 │
│ a    │ 2024-01-25 │
│ a    │ 2024-01-25 │
│ a    │ 2024-01-25 │
│ a    │ 2024-01-25 │
│ a    │ 2024-01-29 │
│ a    │ 2024-01-29 │
│ a    │ 2024-01-29 │
└──────┴────────────┘# 分析4
SELECTname,(ct - arr_index) AS diff,count(1)
FROM(SELECTname,groupArray(cdate) AS arr,arrayEnumerate(arr) AS idxFROMtb_shopGROUP BY name)
ARRAY JOIN
arr AS ct,
idx AS arr_index
GROUP BY name, diff;
┌─name─┬───────diff─┬─count()─┐
│ c    │ 2024-02-041 │
│ a    │ 2024-01-254 │
│ b    │ 2024-02-014 │
│ a    │ 2024-01-293 │
└──────┴────────────┴─────────┘
# 分析5
SELECTname,(ct - arr_index) AS diff,count(1) AS cc
FROM(SELECTname,groupArray(cdate) AS arr,arrayEnumerate(arr) AS idxFROMtb_shopGROUP BY name)
ARRAY JOIN
arr AS ct,
idx AS arr_index
GROUP BY name, diff
ORDER BY name, cc DESC;
┌─name─┬───────diff─┬─cc─┐
│ a    │ 2024-01-254 │
│ a    │ 2024-01-293 │
│ b    │ 2024-02-014 │
│ c    │ 2024-02-041 │
└──────┴────────────┴────┘# 分析6
SELECTname,(ct - arr_index) AS diff,count(1) AS cc
FROM(SELECTname,groupArray(cdate) AS arr,arrayEnumerate(arr) AS idxFROMtb_shopGROUP BY name)
ARRAY JOIN
arr AS ct,
idx AS arr_index
GROUP BY name, diff
ORDER BY name, cc DESC
LIMIT 1 BY name;
┌─name─┬───────diff─┬─cc─┐
│ a    │ 2024-01-254 │
│ b    │ 2024-02-014 │
│ c    │ 2024-02-041 │
└──────┴────────────┴────┘

六、连接函数

请添加图片描述

6.1 连接精度

  • 连接精度决定了JOIN查询在连接数据时所使用的策略,目前支持ALL、ANY和ASOF三种类型。如果不主动声明,则默认是ALL。可以通过join_default_strictness配置参数修改默认的连接精度类型。
  • 对数据是否连接匹配的判断是通过JOIN KEY进行的,目前只支持等式(EQUAL JOIN)。交叉连接(CROSS JOIN)不需要使用JOIN KEY,因为它会产生笛卡尔积。
# 准备数据
DROP TABLE IF EXISTS yg;
CREATE TABLE yg(id Int8,name String,age UInt8,bid Int8
)ENGINE = Log;
INSERT INTO yg VALUES(1, 'AA', 23, 1),
(2, 'BB', 24, 3),
(3, 'VV', 27, 1),
(4, 'CC', 13, 3),
(5, 'KK', 53, 3),
(6, 'MM', 33, 3);DROP TABLE IF EXISTS bm;
CREATE TABLE bm(bid Int8,name String
)ENGINE = Log;
INSERT INTO bm VALUES(1, 'x'),(2, 'Y'),(3, 'z');DROP TABLE IF EXISTS gz;
CREATE TABLE gz(id Int8,jb Int64,jj Int64
)ENGINE = Log;
INSERT INTO gz VALUES(1, 1000, 2000),
(1, 1000, 2000),(2, 2000, 1233),(3, 2000, 3000),(4, 4000, 1000);

6.1.1 ALL

如果左表内的一行数据,在右表中有多行数据与之连接匹配,则返回右表中全部连接的数据。而判断连接匹配的依据是左表与右表内的数据,基于连接键(JOIN KEY)的取值完全相等(equals),等同于left.key = right.key

# 分析1
SELECT *
FROMyg
ALL INNER JOIN gz ON yg.id = gz.id;
┌─id─┬─name─┬─age─┬─bid─┬─gz.id─┬───jb─┬───jj─┐
│  1 │ AA   │  231110002000 │
│  1 │ AA   │  231110002000 │
│  2 │ BB   │  243220001233 │
│  3 │ VV   │  271320003000 │
│  4 │ CC   │  133440001000 │
└────┴──────┴─────┴─────┴───────┴──────┴──────┘

6.1.2 ANY

如果左表内的一行数据,在右表中有多行数据与之连接匹配,则返回右表中第一行连接的数据。ANY与ALL判断连接匹配的依据相同。

# 分析2
SELECT *
FROMyg
ANY INNER JOIN gz ON yg.id = gz.id;
┌─id─┬─name─┬─age─┬─bid─┬─gz.id─┬───jb─┬───jj─┐
│  1 │ AA   │  231110002000 │
│  2 │ BB   │  243220001233 │
│  3 │ VV   │  271320003000 │
│  4 │ CC   │  133440001000 │
└────┴──────┴─────┴─────┴───────┴──────┴──────┘

6.1.3 ASOF

ASOF连接键之后追加定义一个模糊连接的匹配条件ASOF_COLUMN。

DROP TABLE IF EXISTS emp1;
CREATE TABLE emp1(id Int8,name String,ctime DateTime
)ENGINE = Log;
INSERT INTO emp1 VALUES(1, 'AA', '2021-01-03 00:00:00'),(1, 'AA', '2021-01-02 00:00:00'),(2, 'CC', '2021-01-01 00:00:00'),(3, 'DD', '2021-01-01 00:00:00'),(4, 'EE', '2021-01-01 00:00:00');DROP TABLE IF EXISTS emp2;
CREATE TABLE emp2(id Int8,name String,ctime DateTime
)ENGINE = Log;
INSERT INTO emp2 VALUES (1, 'aa', '2021-01-02 00:00:00'),(1, 'aa', '2021-01-02 00:00:00'),(2, 'cc', '2021-01-02 00:00:00'),(3, 'dd', '2021-01-02 00:00:00');# 分析
SELECT 
*
FROM emp1
ASOF INNER JOIN emp2
ON (emp1.id = emp2.id) AND (emp1.ctime > emp2.ctime);
┌─id─┬─name─┬───────────────ctime─┬─emp2.id─┬─emp2.name─┬──────────emp2.ctime─┐
│  1 │ AA   │ 2021-01-03 00:00:001 │ aa        │ 2021-01-02 00:00:00 │
└────┴──────┴─────────────────────┴─────────┴───────────┴─────────────────────┘

七、系统函数介绍

ClickHouse主要提供两类函数-普通函数和聚合函数。普通函数由IFunction接口定义,拥有数十种函数实现,例如FunctionFormationDateTime、FunctionSubstring等。除了一些常见的函数(诸如四则运算、日期转换等之外),也不乏一些非常实用的函数,例如网址提取函数、IP地址脱敏函数等。普通函数是没有状态的,函数效果作用于每行数据之上。当然,在函数具体执行的过程中,并不会一行一行地运算,而是采用向量化的方式直接作用于一整列数据。聚合函数由IAggregateFunction接口定义,相比于无状态的普通函数,聚合函数是有状态的。以COUNT聚合函数为例,其AggregateFunctionCount的状态使用整UInt64记录。聚合函数的状态支持序列化与反序列话,所以能够在分布式节点之间进行传输,以实现增量计算。

  • 普通函数
    • 类型转换函数
    • 日期函数
    • 条件函数
    • 数组函数
    • 字符串函数
    • json解析函数
  • 高阶函数
  • 聚合函数
  • 表函数

ps:详情见官网

八、JSON解析案例

-- 建表
DROP TABLE IF EXISTS tb_ods_log;
CREATE TABLE tb_ods_log (line String
) ENGINE = Log;INSERT INTO tb_ods_log VALUES('{"account":"14d9TM","deviceId":"Kcjksekjg","ip":"180.12.12.3","sessionId":"sfjkeIGj","eventId":"","properties":{"adId":"6","adCampain":"7"},"timeStamp":18992891918}'),('{"account":"14d9TM","deviceId":"Kcfafafkjg","ip":"180.12.12.3","sessionId":"sfjkeIGj","eventId":"","properties":{"adId":"6","adCampain":"7"},"timeStamp":189923891918}'),('{"account":"14faTM","deviceId":"Kcfaekjg","ip":"180.12.12.3","sessionId":"sfjkeIGj","eventId":"","properties":{"adId":"6","adCampain":"5"},"timeStamp":189924891918}');# json解析
WITH visitParamExtractString(line, 'account') as account,visitParamExtractString(line, 'deviceId') as deviceId,visitParamExtractString(line, 'sessionId') as sessionId,visitParamExtractRaw(line, 'properties') as properties,visitParamExtractInt(line, 'timeStamp') as timeStamp
SELECTaccount,deviceId,sessionId,properties,timeStamp
FROMtb_ods_log 
LIMIT 10;┌─account─┬─deviceId───┬─sessionId─┬─properties───────────────────┬────timeStamp─┐
│ 14d9TM  │ Kcjksekjg  │ sfjkeIGj  │ {"adId":"6","adCampain":"7"} │  18992891918 │
│ 14d9TM  │ Kcfafafkjg │ sfjkeIGj  │ {"adId":"6","adCampain":"7"} │ 189923891918 │
│ 14faTM  │ Kcfaekjg   │ sfjkeIGj  │ {"adId":"6","adCampain":"5"} │ 189924891918 │
└─────────┴────────────┴───────────┴──────────────────────────────┴──────────────┘

九、实用函数

在进行数据分析的时,通常会设计到计算或者类型转换;在进行此处理过程中会出现类型不兼容的情况,而此时就可以通过toTypeName(name)函数来打印某一变量的类型进行排查。

SELECT1 AS b,toTypeName(b)┌─b─┬─toTypeName(1)─┐
│ 1 │ UInt8         │
└───┴───────────────┘

十、语法注意事项

  • cklickhouse大小写敏感
  • 实现需求的时候可以先查找ck是否有函数可以支持,如果不支持再去想其他方式

课件学习地址

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

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

相关文章

12个RAG常见痛点及解决方案

Barnett等人的论文《Seven Failure Points When Engineering a Retrieval Augmented Generation System》介绍了RAG的七个痛点,我们将其延申扩展再补充开发RAG流程中常遇到的另外五个常见问题。并且将深入研究这些RAG痛点的解决方案,这样我们能够更好地在…

导出pdf 加密、加水印、加页脚

1.依赖 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.10</version> </dependency> <dependency> …

cnpm : 无法加载文件 C:\Users\xxx\AppData\Roaming\npm\cnpm.ps1

cnpm命令被禁止使用 我已经安装cnpm &#xff0c;但是使用不了&#xff0c;重新安装也没用。 报错如下图&#xff1a; cnpm无法使用报错 解决问题 1、打开系统Windows PowerShell,使用管理员身份运行。 打开Windows PowerShell 2、输入set-ExecutionPolicy RemoteSigned&a…

第三篇:跨平台QT开发-元对象系统

元对象系统 元对象系统是一个基于 标准 C的扩展 &#xff0c;为 Qt 提供了信号与槽机制、实时类型信息,动态属性系统 元对象系统的三个基本条件&#xff1a;类必须继承自 QObject、类声明 Q_OBJECT 宏&#xff08;默认私有 有&#xff09;、元对象编译器 moc。 class ExamDia…

Matplotlib雷达图教程:学会绘制炫酷多彩的多维数据可视化【第53篇—python:Seaborn大全】

文章目录 Matplotlib雷达图绘制指南&#xff1a;炫酷雷达图参数解析与实战1. 普通雷达图2. 堆叠雷达图3. 多个雷达图4. 矩阵雷达图5. 极坐标雷达图6. 定制化雷达图外观7. 调整雷达图坐标轴范围8. 雷达图的子图布局9. 导出雷达图总结 Matplotlib雷达图绘制指南&#xff1a;炫酷雷…

在flutter中集成Excel导入和导出

flutter中集成Excel导入和导出功能 1、需要的依赖 在pubspec.yaml #excel导出syncfusion_flutter_xlsio: ^24.1.45open_file: ^3.0.1#导入excelflutter_excel: ^1.0.1#选择文件的依赖file_picker: ^6.1.1&#xff08;1&#xff09;依赖说明 在测试时&#xff0c;我们在使用导…

spring问题点

1.事务 1.1.事务传播 同一个类中 事务A调非事务B B抛异常 AB事务生效&#xff08;具有传播性&#xff09; 同一个类中 事务A调非事务B A抛异常 AB事务生效 也就是主方法加了事务注解 则方法内调用的其他本类方法无需加事务注解&#xff0c; 发生异常时可以保证事务的回滚 最常…

Docker极速入门掌握基本概念和用法

1、Docker概念 1.1什么是docker Docker是一个快速交付应用、运行应用的技术&#xff0c;具备以下优势 可将程序及其依赖、运行环境一起打包为一个镜像&#xff0c;可以迁移到任意Linux操作系统运行时利用沙箱机制形成隔离容器&#xff0c;各个应用互不干扰启动、移除都可以通…

【PTA浙大版《C语言程序设计(第4版)》编程题】练习7-4 找出不是两个数组共有的元素(附测试点)

目录 输入格式: 输出格式: 输入样例: 输出样例: 代码呈现 测试点 给定两个整型数组&#xff0c;本题要求找出不是两者共有的元素。 输入格式: 输入分别在两行中给出两个整型数组&#xff0c;每行先给出正整数N&#xff08;≤20&#xff09;&#xff0c;随后是N个整数&a…

小鱼深度产品测评之:阿里云一键部署幻兽帕鲁,真正1分钟部署,3分钟进入游戏,无限畅玩,双倍快乐。

阿里云一键部署幻兽帕鲁 一、 引言二、 部署过程2.1 进入游戏联机服务专题页2.2 服务购买2.3 服务创建 三、游戏体验3.1 进入Palword3.2 游戏体验3.3 服务器更新3.4 定时备份存档 三、 总结3.1 部署体验3.2 游戏体验 一、 引言 首先。感谢阿里云的运营小姐姐定邀我来参与这次幻…

机器学习 | 如何构建自己的决策树算法?

决策树思想的来源非常朴素&#xff0c;程序设计中的条件分支结构就是if-else结构&#xff0c;最早的决策树就是利用这类结构分割数据的一种分类学习方法 目录 初识决策树 决策树原理 cart剪枝 特征提取 泰坦尼克号乘客生存预测(实操) 回归决策树 初识决策树 决策树是一种…

idea 中 tomcat 乱码问题修复

之前是修改 Tomcat 目录下 conf/logging.properties 的配置&#xff0c;将 UTF-8 修改为 GBK&#xff0c;现在发现不用这样修改了。只需要修改 IDEA 中 Tomcat 的配置就可以了。 修改IDEA中Tomcat的配置&#xff1a;添加-Dfile.encodingUTF-8 本文结束

嵌入式软件中常见的 8 种数据结构

数据结构是一种特殊的组织和存储数据的方式&#xff0c;可以使我们可以更高效地对存储的数据执行操作。数据结构在计算机科学和软件工程领域具有广泛而多样的用途。 几乎所有已开发的程序或软件系统都使用数据结构。此外&#xff0c;数据结构属于计算机科学和软件工程的基础。当…

pytorch创建tensor

目录 1. 从numpy创建2. 从list创建3. 创建未初始化tensor4. 设置默认tensor创建类型5. rand/rand_like, randint6. randn生成正态分布随机数7. full8. arange/range9. linspace/logspace10. Ones/zeros/eye11. randperm 1. 从numpy创建 2. 从list创建 3. 创建未初始化tensor T…

【iOS ARKit】2D肢体动作捕捉

人体肢体动作捕捉在动漫影视制作、游戏CG 动画、实时模型驱动中有着广泛的应用&#xff0c;利用 ARKit&#xff0c;无须额外的硬件设备即可实现 2D和3D人体一系列关节和骨骼的动态捕捉&#xff0c;由于移动AR 的便携性及低成本&#xff0c;必将促进相关产业的发展。 ARBody Tr…

物流自动化移动机器人|HEGERLS三维智能四向穿梭车助力优化企业供应链

智能化仓库/仓储贯穿于物流的各个环节&#xff0c;不局限于存储、输送、分拣、搬运等单一作业环节的自动化&#xff0c;更多的是利用科技手段实现整个物流供应链流程的自动化与智能化&#xff0c;将传统自动化仓储物流各环节进行多维度的有效融合。 例如在数智化物流仓储的建设…

记录element-plus树型表格的bug

问题描述 如果数据的子节点命名时children,就没有任何问题&#xff0c;如果后端数据结构子节点是其他名字&#xff0c;比如thisChildList就有bug const tableData [{id: 1,date: 2016-05-02,name: wangxiaohu,address: No. 189, Grove St, Los Angeles,selectedAble: true,th…

阿里云一键部署雾锁王国联机服务器详细教程

雾锁王国(Enshrouded)作为一款热门多人在线游戏&#xff0c;为了给玩家提供稳定、流畅的联机体验&#xff0c;阿里云提供了高效便捷的快速部署解决方案&#xff0c;本文将为大家分享阿里云一键部署雾锁王国联机服务器详细教程。 第一步&#xff1a;使用快速部署模板 1、登录阿…

数据湖系列之二 | 打造无限扩展的云存储系统,元数据存储底座的设计和实践

海量数据对数据湖存储的扩展能力提出了极高的要求。元数据面作为云存储最核心、最底层的系统之一&#xff0c;直接决定了存储系统的扩展性。 本文作为数据湖系列的第二篇&#xff0c;将为大家揭开元数据面存储底座的秘密&#xff0c;如何设计能够支撑存储容量的“无限扩展”。…

2024美赛数学建模D题思路分析 - 大湖区水资源问题

1 赛题 问题D&#xff1a;大湖区水资源问题 背景 美国和加拿大的五大湖是世界上最大的淡水湖群。这五个湖泊和连接的水道构成了一个巨大的流域&#xff0c;其中包含了这两个国家的许多大城市地区&#xff0c;气候和局部天气条件不同。 这些湖泊的水被用于许多用途&#xff0…