大数据ClickHouse进阶(八):ClickHouse的with子句

举报
Lansonli 发表于 2022/09/19 08:43:46 2022/09/19
【摘要】 ClickHouse的with子句ClickHouse支持with子句以增强语句的表达,例如如下查询:node1 :) SELECT pow(pow(2,2),3)┌─pow(pow(2, 2), 3)─┐│ 64 │└───────────────────┘我们可以通过使用with子句进行简化,提高可读性:node1 :) WITH pow(2,2) AS a...

ClickHouse的with子句

ClickHouse支持with子句以增强语句的表达,例如如下查询:

node1 :) SELECT pow(pow(2,2),3)
┌─pow(pow(2, 2), 3)─┐
│                64 │
└───────────────────┘

我们可以通过使用with子句进行简化,提高可读性:

node1 :) WITH pow(2,2) AS a SELECT power(a,3)
┌─pow(a, 3)─┐
│        64 │
└───────────┘


with的使用支持如下四种用法:

一、定义变量

可以通过with定义变量,这些变量在后续的查询子句中可以直接访问。

例如:

node1 :) WITH 10 AS start
SELECT number
FROM system.numbers
WHERE number > start
LIMIT 5
┌─number─┐
│     11 │
│     12 │
│     13 │
│     14 │
│     15 │
└────────┘


二、调用函数

可以访问select子句中的列字段,并调用函数做进一步处理,处理之后的数据可以在select子句中继续使用。

例如:

node1 :) WITH SUM(data_uncompressed_bytes) AS bytes
SELECT
    database,
    formatReadableSize(bytes) AS format
FROM system.columns
GROUP BY database
ORDER BY bytes DESC

┌─database─┬─format─────┐
│ datasets │ 7.40 GiB   │
│ system   │ 197.27 MiB │
│ default  │ 0.00 B     │
└──────────┴────────────┘


三、定义子查询

可以使用with定义子查询,例如,借助子查询可以得出各database未压缩数据大小与数据总和大小的比例排名:

node1 :) WITH (
        SELECT SUM(data_uncompressed_bytes)
        FROM system.columns
    ) AS total_bytes
SELECT
    database,
    (SUM(data_uncompressed_bytes) / total_bytes) * 100 AS database_disk_usage
FROM system.columns
GROUP BY database
ORDER BY database_disk_usage DESC

┌─database─┬─database_disk_usage─┐
│ datasets │   97.31767735000648 │
│ system   │   2.682322649993527 │
│ default  │                   0 │
└──────────┴─────────────────────┘


注意:在with中使用子查询时智能返回一行数据,如果结果集大于一行则报错。

四、在子查询中重复使用with

在子查询中可以嵌套使用With子句,例如,在计算出各database未压缩数据大小与数据总和的比例之后,又进行取整函数操作:

node1 :) WITH round(database_disk_usage) AS database_disk_usage_v1
SELECT
    database,
    database_disk_usage,
    database_disk_usage_v1
FROM
(
    WITH (
            SELECT SUM(data_uncompressed_bytes)
            FROM system.columns
        ) AS total_bytes
    SELECT
        database,
        (SUM(data_uncompressed_bytes) / total_bytes) * 100 AS database_disk_usage
    FROM system.columns
    GROUP BY database
    ORDER BY database_disk_usage DESC
)

┌─database─┬─database_disk_usage─┬─database_disk_usage_v1─┐
│ datasets │    97.2911778785499 │                     97 │
│ system   │  2.7088221214500954 │                      3 │
│ default  │                   0 │                      0 │
└──────────┴─────────────────────┴────────────────────────┘
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。