首页 > 数据库 >Mysql和Clickhouse数据查询-按照时间分组统计并且对无无数据的日期补0

Mysql和Clickhouse数据查询-按照时间分组统计并且对无无数据的日期补0

时间:2024-03-11 11:46:04浏览次数:21  
标签:00 01 expr INTERVAL Clickhouse Mysql 数据 ORDER select

  最近在做数据查询需求的时候,遇到按照时间分组查询统计指标的需求,比如说查询模块的最近 15 天访问数据量,没有数据的日期补 0,以前对于这种类似的需求都是通过代码来补数据,想试试 sql 实现这种查询,因此查询了不少文章,对于类似实现方法的文章网上也有很多,差异也很多,因此这篇文章只作为一个参考,提供一个思路.

 

对于 mysql

  比如刚才这个需求是是针对 MySQL 的,查询模块的最近 15 天访问数据量,没有数据的日期补 0。

  对于这个 sql 我们主要思路是按照table 种日期字段进行分组,然后用一个日期序列对结果进行 join,没有数据的日期直接补 0:

select 
	DATE_FORMAT(DATE_SUB(now(),INTERVAL xc day),'%Y-%m-%d') as date_str
from
(
-- 获取0-14 的序列  @xi:=@xi+1  每次执行都加一
select 
	@xi := @xi +1 as xc
	from
	(select 1 union select 2 union select 3) xc1,
	(select 1 union select 2 union select 3 union select 4 union select 5) xc2,
	(select @xi := -1) xc0
)xcxc 

执行结果如下:

然后使用结果 left join 查询结果,null 就补0 即可。

 

对于 clickhouse

  clickhouse提供的函数很多,也提供了类似需求的方案。对于 clickhouse 我接触不是很多,或许还有很多更好的方案。

  需求按照分钟或者小时聚合数据:

 

-- 按照分钟统计
select 
toStartOfInterval(start_t, INTERVAL 1 MINUTE) AS data_str,
count() AS records
FROM xxxx.xxxxxx
WHERE xxxxx
GROUP BY data_str
ORDER BY date_str 
WITH fill 
FROM toDateTime('2024-02-22 23:00:00')
TO toDateTime('2024-02-22 23:59:59')
step 1*60


-- 按照小时统计
select 
toStartOfInterval(start_t, INTERVAL 1 hour) AS data_str,
count() AS records
FROM xxxx.xxxxxx
WHERE xxxxx
GROUP BY data_str
ORDER BY date_str 
WITH fill 
FROM toDateTime('2024-02-22 23:00:00')
TO toDateTime('2024-02-21 23:59:59')
step 1*3600

 这里不贴图展示查询结果了。

主要是通过 2 个语法实现。

 toStartOfInterval()和 with fill 。建议查看官方文档了解

https://clickhouse.com/docs/en/sql-reference/statements/select/order-by#filling-grouped-by-sorting-prefix

 

注意事项:ck 我的需求是使用 java 连接查询,使用 druid 连接 ck 的时候,需要去掉 wall filter,因为 ck 的语法 有些不太符合标准 sql,druid 的 sqlparser 会报错拦截。

 

以下来自官方文档

toStartOfInterval(date_or_date_with_time, INTERVAL x unit [, time_zone])

This function generalizes other toStartOf*() functions. For example,

  • toStartOfInterval(t, INTERVAL 1 year) returns the same as toStartOfYear(t),
  • toStartOfInterval(t, INTERVAL 1 month) returns the same as toStartOfMonth(t),
  • toStartOfInterval(t, INTERVAL 1 day) returns the same as toStartOfDay(t),
  • toStartOfInterval(t, INTERVAL 15 minute) returns the same as toStartOfFifteenMinutes(t).

The calculation is performed relative to specific points in time:

Interval Start
year year 0
quarter 1900 Q1
month 1900 January
week 1970, 1st week (01-05)
day 1970-01-01
hour (*)
minute 1970-01-01 00:00:00
second 1970-01-01 00:00:00
millisecond 1970-01-01 00:00:00
microsecond 1970-01-01 00:00:00
nanosecond 1970-01-01 00:00:00

(*) hour intervals are special: the calculation is always performed relative to 00:00:00 (midnight) of the current day. As a result, only hour values between 1 and 23 are useful.

 

ORDER BY Expr WITH FILL Modifier

This modifier also can be combined with LIMIT … WITH TIES modifier.

WITH FILL modifier can be set after ORDER BY expr with optional FROM exprTO expr and STEP expr parameters. All missed values of expr column will be filled sequentially and other columns will be filled as defaults.

To fill multiple columns, add WITH FILL modifier with optional parameters after each field name in ORDER BY section.

ORDER BY expr [WITH FILL] [FROM const_expr] [TO const_expr] [STEP const_numeric_expr], ... exprN [WITH FILL] [FROM expr] [TO expr] [STEP numeric_expr]
[INTERPOLATE [(col [AS expr], ... colN [AS exprN])]]
 

WITH FILL can be applied for fields with Numeric (all kinds of float, decimal, int) or Date/DateTime types. When applied for String fields, missed values are filled with empty strings. When FROM const_expr not defined sequence of filling use minimal expr field value from ORDER BY. When TO const_expr not defined sequence of filling use maximum expr field value from ORDER BY. When STEP const_numeric_expr defined then const_numeric_expr interprets as is for numeric types, as days for Date type, as seconds for DateTime type. It also supports INTERVAL data type representing time and date intervals. When STEP const_numeric_expr omitted then sequence of filling use 1.0 for numeric type, 1 day for Date type and 1 second for DateTime type. INTERPOLATE can be applied to columns not participating in ORDER BY WITH FILL. Such columns are filled based on previous fields values by applying expr. If expr is not present will repeat previous value. Omitted list will result in including all allowed columns.

Example of a query without WITH FILL:

SELECT n, source FROM (
   SELECT toFloat32(number % 10) AS n, 'original' AS source
   FROM numbers(10) WHERE number % 3 = 1
) ORDER BY n;
 

Result:

┌─n─┬─source───┐
│ 1 │ original │
│ 4 │ original │
│ 7 │ original │
└───┴──────────┘

 

标签:00,01,expr,INTERVAL,Clickhouse,Mysql,数据,ORDER,select
From: https://www.cnblogs.com/lovedudu/p/18065497

相关文章

  • Dynamics CRM 2013 常用SQL查询基础数据
    获取实体SELECT*FROMEntityWHERELogicalName='EntityName'获取字段名称SELECTdistinctA.nameAS字段名,L.labelAS显示名,AT.descriptionAS类型,L.ObjectColumnNameAS形式,A.IsNullableAScodefromattributeAINNERJOINlocalizedlabelLONA.Attributei......
  • 数据可视化能够怎样为智慧林业服务?
    数据可视化是当下科技发展中的一项重要工具,它在各行各业都展现了强大的应用价值。在智慧林业领域,数据可视化更是发挥了独特的作用,为林业管理和生态保护提供了有效的支持和解决方案。下面我就以可视化从业者的角度,来简单聊聊这个话题。通过数据可视化技术,林业管理者......
  • Java 对接Zabbix获取主机监控+告警数据
    1.Java对接ZabbixAPI前提准备  zabbix对接文档地址: https://www.zabbix.com/documentation/6.4/zh/manual/api对接ZabbixAPI接口需要针对对接的用户授予对应的API权限,如下图所示 使用超管账户登录zabbix 用户--->用户,查看用户列表      点击对接......
  • 开源无代码 / 低代码平台 NocoBase 0.20:支持多数据源
    NocoBase是一个极易扩展的开源无代码开发平台。完全掌控,无限扩展,助力你的开发团队快速响应变化,显著降低成本,不必投入几年时间和数百万资金研发,只需要花几分钟部署NocoBase。NocoBase中文官网官方文档新特性支持多数据源新增「数据源管理」插件,用于管理所有数据源的数据表......
  • Python 在Word中创建表格并填入数据、图片
    在Word中,表格是一个强大的工具,它可以帮助你更好地组织、呈现和分析信息。本文将介绍如何使用Python在Word中创建表格并填入数据、图片,以及设置表格样式等。PythonWord库:要使用Python在Word中创建或操作表格,需要先将Spire.DocforPython这个第三方库安装到项目中.pipinstall......
  • MySQL 8.0.26版本升级32版本查询数据为空的跟踪
    某业务系统将MySQL8.0.26升级为GreatSQL8.0.32-24后,某些特定的SQL语句不能查询到数据。经测试MySQL8.0.32也存在相同的问题此BUG已在GreatSQL8.0.32-25版本中解决MySQL8.0.26版本升级32版本查询数据为空的跟踪接到客户反馈的问题后,对问题进行了复现和分析。版本信......
  • 常用数据分析模型与方法
    一、背景数据分析中,会有一些分析方法来处理不同的问题。简单总结一下。方法汇总:https://share.mindmanager.com/#publish/5v_9k6Z9J3gqPL9sQwAGGKL5DgNrclp4iq_q8C7L    方法链接: 二、RFM分析2.1 定义R(Recency): 客户距离最近的一次采购时间的间隔。F( Freq......
  • Mysql如何给字符串添加索引(前缀索引)
    在日常开发中,我们经常给字符串添加索引,那么给字段添加索引有什么技巧吗,我们看看下面的例子,我们给一个邮箱添加索引,应该如何添加呢看看下面这条sqlselect*fromuserwhereemail='[email protected]'如果我们不添加索引,肯定是要进行全表扫描的,那么我们如何添加呢有两种方式a......
  • 大型数据库应用——一些笔记
    这学期选了大型数据库应用,主要是和java一起用的,然后这里是一些笔记,可能会加上之前的一些笔记,之前学过数据库原理。一、介绍一些数据库1数据库分类数据库根据数据结构可分为关系型数据库和非关系型数据库。非关系型数据库中根据应用场景又可分为键......
  • MYSQL学习笔记23: 多表查询(自连接内连接+左右外连接)
    多表查询(自连接)自连接查询,可以是内连接查询,也可以是外连接查询select字段列表from表A别名Ajoin表A别名Bon条件...;自连接内连接查询员工以及所属领导的名字#可以这样写selecte1.name'员工',e2.name'上司'fromempe1joinempe2one1.man......