clickhouse的几个进阶语法

简介: 包含如何实现分时统计,如何实现聚合某一列,如何更新操作

一、背景

  前面发布了一篇关于clickhouse常用的基础语法,有很多浏览量,这次给小伙伴分享几个进阶语法,比如如何实现分时统计,当然是通过我们的toStartOfDay()语法实现的,如何实现聚合某一列,如何更新操作,我会举几个例子供大家参考使用。
   想了解其他数据库语法,请看。

clickhouse的常用语法你知道吗
Mysql数据库常用命令总结
关于PostgreSQL数据增删改查的日常总结(主要jsonb类型)

二、更新语法

1、更新满足条件的数据列
ALTER TABLE mytable.mytable
UPDATE
    mytableType = 'A'
WHERE
    `time` >'2021-10-07'
2、更新表注释
ALTER TABLE table_with_comment MODIFY COMMENT 'new comment on a table';
1、重命名表的某一列
ALTER TABLE visits RENAME COLUMN webBrowser TO browser
1、更新某一列的字段类型
ALTER TABLE visits MODIFY COLUMN browser Array(String)

三、分时统计

  在开发中我们可能会有需求去计算每一条的订单数量返回给前台,假如我们通过常规的方法,开始时间大于早上零点,结束时间小于晚上24点,虽然可以满足需求,但是需要for循环多次查询获取每一条的数据,肯定效率低了,而且我们用的是clickhouse,号称最快的数据库,这么搞肯定没有用到极致,那么我们可以使用这么多方法,一次查询,返回所以结果,如下。

  • toStartOfHour()
  • toStartOfInterval()
  • toStartOfFifteenMinutes()
  • toStartOfFiveMinute()
  • toStartOfMonth()
  • toStartOfQuarter()
  • toStartOfWeek()
  • toStartOfDay()
1、按天分组求每一天的订单数
SELECT
    toStartOfDay(time) time_interval ,
    sum(order_num) num
FROM
    mytable.mytable
GROUP BY
    toStartOfDay(order_num)

我们有这么多方法,看到字面意思应该就明白了吧。

2、完成间隔5分钟的分时统计
select 
toStartOfInterval(time, INTERVAL 5  minute) as minute,
count() as sumcount
from table_all
group by minute 
order by sumcount desc;
3、获取过去七天的分时统计数据

  numbers(7)是我们的参照表,假如不使用,当某一天数据库里没有数据就不会查询出来,这样我们想获取七天的数据就会不够七天,不方便我们在代码中写业务逻辑,所以我们使用了一个参照表。

SELECT
        any(toDate(time)),
        any(num)
FROM
        (
                SELECT
                        toStartOfDay(toDate(toUnixTimestamp(now64(3), 'Asia/Shanghai')-number*3600*24)) time,
                        toUInt16(0) AS num
                FROM
                        numbers(7)
                
                UNION ALL
                
                SELECT
                        toStartOfDay(time) AS time,
                        count(*)           as num
                FROM
                        mytable.mytable
                group by
                        time
        )
GROUP BY
        time
ORDER BY
        time
4、带where条件的分时统计

  获取过去1000天的统计,当天没有数据的赋值为0。

SELECT
        toDate(time) as time,
        num
FROM
        (
                SELECT
                        toStartOfDay(toDate(toUnixTimestamp(now64(3), 'Asia/Shanghai')-number*3600*24)) time,
                        toUInt16(0) AS num
                FROM
                        numbers(1000)
                 
                UNION ALL
                 
                SELECT
                        toStartOfDay(time) AS time,
                        count(*)           as num
                FROM 
                        mytable.mytable   
                group by
                        time
        )
        
        
        where time >'2021-10-01'  and time <'2021-10-06'
GROUP BY
        time ,num
ORDER BY
        time   
5、按秒查询进行统计
SELECT
        time as time,
        num
FROM
        (
                SELECT
                        toStartOfSecond(toDateTime64(toUnixTimestamp(now()), 3)-number) time,
                        0 as num
                FROM
                        numbers(100000)
                  
                UNION ALL
                  
                SELECT
                        toStartOfSecond(thisTime) AS thisTime,
                        count(*)           as num
                FROM
                        mytable.mytable  where devIp ='1'
                group by
                        thisTime
        )
         
         
        where time >'2022-01-01'  and time <'2022-01-12'
GROUP BY
        time ,num
ORDER BY
        time

四、聚合某列

1、按地区分组聚合手机号

这个vm_concat方法可以将某个字段聚合到一个字段里,以逗号分割,我们查询结束后在代码中通过split(",")可以很方便获取某一个组的数据。

SELECT
    phone_attr AS area,
    wm_concat(phone_ip) AS phoneIps
FROM
    xda_phone
GROUP BY
    phone_attr

我们有这么多方法,看到字面意思应该就明白了吧。

三、总结

  以上就是就是关于clickhouse数据库进阶语法,包含如何实现分时统计,如何实现聚合某一列,如何更新操作,可以参考一下,觉得不错的话,欢迎微信搜索关注java基础笔记,后面会不断更新相关知识,大家一起进步。

目录
相关文章
|
关系型数据库 Java MySQL
clickhouse的常用语法你知道吗
clickhouse数据库,总结了一些常用的语法
383 0
clickhouse的常用语法你知道吗
|
存储 SQL 关系型数据库
ClickHouse常见数据类型以及常用SQL语法
ClickHouse常见数据类型以及常用SQL语法
|
4月前
|
存储 关系型数据库 数据库
【DDIA笔记】【ch2】 数据模型和查询语言 -- 多对一和多对多
【6月更文挑战第7天】该文探讨数据模型,比较了“多对一”和“多对多”关系。通过使用ID而不是纯文本(如region_id代替&quot;Greater Seattle Area&quot;),可以实现统一、避免歧义、简化修改、支持本地化及优化搜索。在数据库设计中,需权衡冗余和范式。文档型数据库适合一对多但处理多对多复杂,若无Join,需应用程序处理。关系型数据库则通过外键和JOIN处理这些关系。文章还提及文档模型与70年代层次模型的相似性,层次模型以树形结构限制了多对多关系处理。为克服层次模型局限,发展出了关系模型和网状模型。
55 6
|
4月前
|
XML NoSQL 数据库
【DDIA笔记】【ch2】 数据模型和查询语言 -- 概念 + 数据模型
【6月更文挑战第5天】本文探讨了数据模型的分析,关注点包括数据元素、关系及不同类型的模型(关系、文档、图)与Schema模式。查询语言的考量涉及与数据模型的关联及声明式与命令式编程。数据模型从应用开发者到硬件工程师的各抽象层次中起着简化复杂性的关键作用,理想模型应具备简洁直观和可组合性。
35 2
|
4月前
|
SQL 人工智能 关系型数据库
【DDIA笔记】【ch2】 数据模型和查询语言 -- 文档模型中Schema的灵活性
【6月更文挑战第8天】网状模型是层次模型的扩展,允许节点有多重父节点,但导航复杂,需要预知数据库结构。关系模型将数据组织为元组和关系,强调声明式查询,解耦查询语句与执行路径,简化了访问并通过查询优化器提高效率。文档型数据库适合树形结构数据,提供弱模式灵活性,但在Join支持和访问局部性上不如关系型。关系型数据库通过外键和Join处理多对多关系,适合高度关联数据。文档型数据库的模式灵活性体现在schema-on-read,写入时不校验,读取时解析,牺牲性能换取灵活性。适用于不同类型或结构变化的数据场景。
42 0
|
4月前
|
SQL JSON NoSQL
【DDIA笔记】【ch2】 数据模型和查询语言 -- 关系模型与文档模型
【6月更文挑战第6天】关系模型是主流数据库模型,以二维表形式展示数据,支持关系算子。分为事务型、分析型和混合型。尽管有其他模型挑战,如网状和层次模型,但关系模型仍占主导。然而,随着大数据增长和NoSQL的出现(如MongoDB、Redis),强调伸缩性、专业化查询和表达力,关系模型的局限性显现。面向对象编程与SQL的不匹配导致“阻抗不匹配”问题,ORM框架缓解但未完全解决。文档模型(如JSON)提供更自然的嵌套结构,适合表示复杂关系,具备模式灵活性和更好的数据局部性。
48 0
|
4月前
|
敏捷开发 存储 缓存
【DDIA笔记】【ch1】 可靠性、可扩展性和可维护性 -- 可维护性
【6月更文挑战第4天】本文探讨了Twitter面临的一次发推文引发的巨大写入压力问题,指出用户粉丝数分布是决定系统扩展性的关键因素。为解决此问题,Twitter采用混合策略,大部分用户推文扇出至粉丝主页时间线,而少数名人推文则单独处理。性能指标包括吞吐量、响应时间和延迟,其中高百分位响应时间对用户体验至关重要。应对负载的方法分为纵向和横向扩展,以及自动和手动调整。文章强调了可维护性的重要性,包括可操作性、简单性和可演化性,以减轻维护负担和适应变化。此外,良好设计应减少复杂性,提供预测性行为,并支持未来改动。
54 0
|
4月前
|
缓存 关系型数据库 数据库
【DDIA笔记】【ch1】 可靠性、可扩展性和可维护性 -- 可扩展性
【6月更文挑战第3天】可扩展性关乎系统应对负载增长的能力,但在产品初期过度设计可能导致失败。理解基本概念以应对可能的负载增长是必要的。衡量负载的关键指标包括日活、请求频率、数据库读写比例等。推特的扩展性挑战在于&quot;扇出&quot;,即用户关注网络的广度。两种策略包括拉取(按需查询数据库)和推送(预计算feed流)。推送方法在推特案例中更为有效,因为它减少了高流量时的实时计算压力。
49 0
|
4月前
|
存储 消息中间件 缓存
【DDIA笔记】【ch1】 可靠性、可扩展性和可维护性 -- part1 可靠性
【6月更文挑战第2天】本书探讨现代数据系统,阐述其在信息社会中的关键作用,包括数据库、缓存、搜索引擎、流处理、批处理和消息队列等组成部分。随着技术发展,工具如Kafka、Spark和Redis等多功能组件使得系统设计更为复杂。面对可靠性、可扩展性和可维护性的挑战,书中强调了容错和韧性的重要性,区分了硬件故障、软件错误和人为错误,并提出了应对措施。可靠性关乎用户数据、企业声誉和生存,因此是系统设计的核心考量。
50 0
硬件开发笔记(十): 硬件开发基本流程,制作一个USB转RS232的模块(九):创建CH340G/MAX232封装库sop-16并关联原理图元器件
有了原理图,可以设计硬件PCB,在设计PCB之间还有一个协同优先动作,就是映射封装,原理图库的元器件我们是自己设计的。为了更好的表述封装设计过程,本文描述了CH340G和MAX232芯片封装创建(SOP-16),并将原理图的元器件关联引脚封装。
硬件开发笔记(十): 硬件开发基本流程,制作一个USB转RS232的模块(九):创建CH340G/MAX232封装库sop-16并关联原理图元器件