文章目录
-
在 clickhouse 中存储嵌套类型的关键字是 Nested, 只支持一级嵌套。数据结构类似于在数据结构类似于在表的单元格里面嵌套"一张表格",如下图所示:
-
嵌套类型是列存储,本质上是一个多维数组结构, 可以在嵌套字段上使用数组函数。
创建嵌套类型的表
sql
CREATE TABLE mydb.student_grades
(
ID UInt64,
Name String,
CourseScore Nested
(
course String,
score Float64
)
) ENGINE = MergeTree()
ORDER BY (ID, Name);
插入读取数据
sql
insert into mydb.student_grades (ID, Name, `CourseScore.course`, `CourseScore.score`)
values (1, '浩轩', ['语文', '数学'], [95.1, 96]),
(2, '语轩', ['语文', '数学'], [94.1, 97]);
查询:
sql
SELECT * FROM mydb.student_grades where Name = '浩轩';
####################################################
┌─ID─┬─Name─┬─CourseScore.course─┬─CourseScore.score─┐
│ 1 │ 浩轩 │ ['语文','数学'] │ [95.1,96] │
└────┴──────┴────────────────────┴───────────────────┘
SELECT CourseScore.score FROM mydb.student_grades where Name = '浩轩';
#####################################
┌─CourseScore.score─┐
│ [95.1,96] │
└───────────────────┘
在嵌套类型上使用数组函数
计算每个人的平均分
sql
SELECT t.Name, arrayReduce('avg', t.CourseScore.score)
FROM mydb.student_grades as t;
#########################
┌─Name─┬─arrayReduce('avg', CourseScore.score)─┐
│ 浩轩 │ 95.55 │
│ 语轩 │ 95.55 │
└──────┴───────────────────────────────────────┘