clickhouse的几个进阶语法_卧龙不言的博客-程序员宝宝_clickhouse 循环

技术标签: 日常总结  分时统计  clickhouse  分组聚合  数据库  

博主简介:原互联网大厂tencent员工,网安巨头Venustech员工,阿里云开发社区专家博主,微信公众号java基础笔记优质创作者,csdn优质创作博主,创业者,知识共享者,欢迎关注,点赞,收藏。

一、背景

  前面发布了一篇关于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基础笔记,后面会不断更新相关知识,大家一起进步。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jiankang66/article/details/123776193

智能推荐

100多个shell脚本的例子_double_happy111的博客-程序员宝宝

本文用于记录学习和日常中使用过的shell脚本【脚本1】打印形状打印等腰三角形、直角三角形、倒直角三角形、菱形#!/bin/bash等腰三角形read -p "Please input the length: " nfor i in seq 1 $ndofor ((j=$n;j&gt;i;j–))doecho -n " "donefor m in seq 1 $idoe...

[email protected]实现客户端单点登录_大大头_1991的博客-程序员宝宝

spring-security-oauth2单点登录流程图  使用支付宝扫描上方二维码领取红包

Java多线程实战——并发框架_尤小硕的博客-程序员宝宝

文章目录并发架构任务执行并发的取消与关闭线程池的使用多线程应该避免的问题避免活跃性问题注意性能并发程序测试并发高阶应用显式锁Java内存模型附录并发架构任务执行为什么需要并发框架更快的响应、更高的吞吐率、更可靠的稳定性串行执行任务例如下面这个例子:/** * 串行的Web服务器: 因为此程序每次只能处理一个请求,所以其执行性能很糟糕 */public class SingleThreadWebServer { public static void main(String[] a

vue项目 单点登录 需要进行访问固定地址且带有.html(客户指定地址不能进行修改)后缀的路径获取token以传到第三方api来获取有效可以[email protected]曾经@的博客-程序员宝宝_to.query.src

vue写的项目 中做单点登录 获取token需要通过客户的固定地址https://XXXX.XX.XX.XX:8081/ombs/pages/gatemsg.html?appid=6&amp;token=V1uRstCQVCR2Am64YDH6BEn(其中ombs/pages/gatemsg.html这个路径不能动)来获取token,再将token传到第三方api来获取一个有效的key,才能...

【Visual C++】游戏开发笔记之一——API函数、DirectX的关键系统_weixin_30251587的博客-程序员宝宝

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。http://blog.csdn.net/zhmxy555/article/details/7318264作者:毛星云邮箱:[email protected] 在从第一节开始看这个笔记系列的话,大家会发现,一上来就开始讲DirectX相关的内...

Redis可视化工具_itbigold的博客-程序员宝宝

Redis做为现在web应用开发的黄金搭担组合,大量的被应用,广泛用于存储session信息,权限信息,交易作业等热数据。Redis作为业界最好的缓存数据库,过去几年发展很快。相对Memcached,Redis提供了更多种数据类型,包含hash、set、list等;Redis还支持subscribe/publish命令,可以用于简单的消息发送与订阅;Redis 3.0开始支持集群服务;Redis也可以把数据库持久化,但是在大多数情况Redis的竞争力是提供缓存服务。随着Redis快速发展,想要用好新功能

随便推点

【无源汇有上下界可行流】ZOJ - 2314 Reactor Cooling_笑对这个世界的志贵的博客-程序员宝宝_无源汇上下界可行流

Step1 Problem: 给你 n 个点,m 条流量下界是 low ,上界是 up 的单向边。问你能否满足每时每刻每条边的流量都在 [low, up] 范围内,如果不满足输出 NO, 满足输出 YES 同时输出每条边的流量。Step2 Ideas: 上下界网络流和平常的网络流不同在于多出了两个点:超级源点 S, 超级汇点 T. 超级源点 S:每条边下界流量都由 S ...

如何寻找数组中的最大值和最小值_JohnLee_chun的博客-程序员宝宝_数组找最大值和最小值

以下五种解法可以寻找到数组中的最大值和最小值;1)问题分解法。    把本题看做两个独立的问题,而非一个问题,所以,每次分别找出最小值和最大值即可,此时,一共需要遍历两次数组,比较次数为2N次;(N表示数组的长度) 2)取单元素法。    维持两个变量min和max,min标记为最小值,max标记为最大值,每次取出一个元素,先与已找到的最小值比较,再与已找到的最大值比较,此种方法只

华为java面试经验_华为面试题(JAVA版)_伽月的博客-程序员宝宝

[编程题] 扑克牌大小时间限制:10秒空间限制:131072K扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A,2各4张,小王1张,大王1张。牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):)3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有...

关于cmd运行java文件问题的解决_Android_YU的博客-程序员宝宝_cmd运行java拒绝访问

这几天帮学弟学妹们解决一些关于cmd运行java文件的小问题,总结出了几种问题:第一种:不是内部或外部命令,也不是可运行的程序或批处理文件。这种的也分几种:1.java不是内部或外部命令,也不是可运行的程序或批处理文件。错误原因:java环境没配好(jdk没装)处理方法:装jdk2.javac不是内部或外部命令,也不是可运行的程序或批处理文件。错误原因:javac环境没配好处理方法...

web项目:漏洞修复(3)_spring过滤器(2)_nxllong的博客-程序员宝宝

web项目:漏洞修复(3)_spring过滤器(2)     第二种方案需要3个java类+修改web.xml配置1.新增HTMLFilter.java无需修改package com.just.reserve.filter;import java.util.*;import java.util.concurrent.ConcurrentHashMap;import java

推荐文章

热门文章

相关标签