首页 > 数据库 >[数据库] SQL特定查询场景之时间段切分方法

[数据库] SQL特定查询场景之时间段切分方法

时间:2023-09-06 12:11:49浏览次数:40  
标签:SQL 查询 切分 时间段 vehicleCount driverTime drivingTimePeriod timeZone select

1 序言

大数据项目、数据分析场景中,经常遇到需要切分时段的需求。
如下是一些项目上的经验总结。

2 实时数仓即席查询场景的解决方法

2.1 函数拼接法

  • 方法特点:
  • 时间数据以时间戳形式存储在数据库,而非以时间字符串
  • 查询时实时运算时间段

基于此,支持根据终端用户所处位置/时区的不同,而实时计算时间段

  • 数据量大、或并发量大时,需考虑数据库的计算资源(CPU、内存)是否充裕
  • 案例1

以Clickhouse为例 / eg. timeZone = Aisa/Shanghai

concat( toString(toHour(create_time , '{{timeZone}}')) , ':' , toString( FLOOR( toMinute(create_time , '{{timeZone}}') / 30 ) * 30 ) ) as time_period -- eg. '8:0' / '18:30'

  • 案例2

以 Clickhouse 为例 / eg. timeZone = Aisa/Shanghai

formatDateTime(
	addMinutes(
		toDate(alarm_recent_time, '{{timeZone}}'),
		floor(
			dateDiff('minute', toDate(alarm_recent_time, '{{timeZone}}') , toDateTime(alarm_recent_time, '{{timeZone}}')) / 30 ,
			0
		) * 30
	)
	, '%H:%M'
) as timePeriod

2.2 查询SQL按不同情况手动分隔时间段

  • 方法特点
  • 时间以时间戳形式存储在数据库
  • 不建议/不适用于需要分几十上百个时段的情况(SQL会非常冗长、易错)
  • 案例

以 Clickhouse 为例

...

(case
	when driverTime >= 0 and driverTime < 1800 then '0.0h-0.5h' -- 驾驶时长(单位:秒) := D 档信号个数 * tsp.vehicle_status_upload_frequency(30s)
	when driverTime >= 1800 and driverTime < 3600 then '0.5h-1.0h'
	when driverTime >= 3600 and driverTime < 7200 then '1.0h-2.0h'
	when driverTime >= 7200 and driverTime < 10800 then '2.0h-3.0h'
	when driverTime >= 10800 and driverTime < 14400 then '3.0h-4.0h'
	when driverTime >= 14400 and driverTime < 21600 then '4.0h-6.0h'
	else '≥6.0h'
END) as drivingTimePeriod

...
UNION ALL

(
	select '0.0h-0.5h' as drivingTimePeriod, 0 as vehicleCount
	union all
	select '0.5h-1.0h' as drivingTimePeriod, 0 as vehicleCount
	union all
	select '1.0h-2.0h' as drivingTimePeriod, 0 as vehicleCount
	union all
	select '2.0h-3.0h' as drivingTimePeriod, 0 as vehicleCount
	union all
	select '3.0h-4.0h' as drivingTimePeriod, 0 as vehicleCount
	union all
	select '4.0h-6.0h' as drivingTimePeriod, 0 as vehicleCount
	union all
	select '≥6.0h' as drivingTimePeriod, 0 as vehicleCount
)

...

2.3 写入数据库时即存储时段字段(timePeriod)

  • 方法特点
  • 不适用于分不同时区查询/分析数据的情况

因为写入的时段字段是某一个固定的时区,无法在查询时根据不同时区进行查询

3 离线数仓离线查询场景的解决方法

TODO

X 参考文献

标签:SQL,查询,切分,时间段,vehicleCount,driverTime,drivingTimePeriod,timeZone,select
From: https://www.cnblogs.com/johnnyzen/p/17681990.html

相关文章

  • [转]Mysql中普通索引key 、主键索引(primary key) 、唯一索引(unique key)与index区别
    原文地址:Mysql中普通索引key、主键索引(primarykey)、唯一索引(uniquekey)与index区别-元小疯-博客园一、索引的定义和由来:    索引被用来快速找出在一个列上用一特定值的行。没有索引,MySQL不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行。 ......
  • linux 安装mysql
    官网下载地址https://downloads.mysql.com/archives/community/ 我的是centos7下载的是这个 2.上传到服务器,解压#在当前目录下(mysql)下创建一个mysql-8.0.33文件夹mkdirmysql-8.0.33#解压安装包到该目录下tar-xvfmysql-8.0.33-1.el7.x86_64.rpm-bundle.tar-C......
  • 启动mysql数据库
    首先确定电脑是否安装mysql在命令行终端输入以下命令来检查MySQL是否已安装:mysql--version如果已安装,将会返回MySQL的版本信息,否则需要先安装MySQL。 手动启动mysql在此电脑--管理--服务和应用程序-- 服务--MySQL 右键启动; 只有先启动mySql才能用 Navicat......
  • SQL 字符类型按数字顺序排序
    字符类型排序,直接用orderby字段asc的话,出来的结果,数字值时,不符合日常的排序习惯,如 如果想2排在1之后,10排在9之后,字符值得按字符ABC排序,可试试以下脚本  ......
  • ssh关闭之后 nginx tomcat mysql服务也被关了
    linux启动tomcat后,关闭ssh连接,tomcat进程停止 linux版本OpenSSH_8.3p1,OpenSSL1.0.2k-fips 26Jan2017老师给的建议是ssh版本降级到7.4  太难了没找到解决办法 最后找到下边文章在sshd@service中加入 KillMode=process配置 并用nohup启服务 生效  ......
  • mysql索引
    1先建表,插入数据,建索引,脚本如下:--建表createtableUser(idbigintauto_incrementprimarykey,namenvarchar(100),ageint,positionnvarchar(100));--插入数据INSERTI......
  • 优化mysql大数据量查询:范围条件与限制结果集的比较
    引言:在处理大数据量的MySQL查询时,优化查询性能是至关重要的。当数据量达到上亿级别时,选择合适的查询条件和方法可以显著影响查询效率和响应时间。本篇博客将重点探讨范围条件查询和限制结果集的两种常见查询方式,并比较它们在大数据场景下的性能差异。范围条件查询:范围条件查询是......
  • Sqlserver中使用DBLINK
    Sqlserver中使用DBLINK一、创建链接服务器1、使用sp_addlinkedserver来增加链接EXECsp_addlinkedserver@server='192.168.2.66',--被访问的服务器别名(习惯上直接使用目标服务器IP,或取个别名如:JOY)@srvproduct='',@provider='SQLOLEDB',@datasrc='192.168.2.66'--要访问的服务......
  • [转]如何在 MySQL / MariaDB 中导入导出数据,导入导出数据库文件、Excel、CSV
    原文地址:如何在MySQL/MariaDB中导入导出数据,导入导出数据库文件、Excel、CSV-掘金在日常的数据库维护工作中,经常需要对数据库进行导入导出操作,备份、分析、迁移数据都需要用到导入导出功能,在本教程中将详细讲解所有常见的MySQL和MariaDB中导入导出数据的方法(注意:MyS......
  • 牛客——SQL253 获取有奖金的员工相关信息
    描述现有员工表employees如下:emp_nobirth_datefirst_namelast_namegenderhire_date100011953-09-02GeorgiFacelloM1986-06-26100021964-06-02BezalelSimmelF1985-11-21有员工奖金表emp_bonus:emp_noreceviedbtype100012010-01-011......