统计每2个小时时间段的设备各种状态时长,使用SQL做数据分析,“查表法”“表驱动法”使用案例分析

“表驱动法”是一种编程设计模式。

使用一个表(使用数据结构,如数组、字典,Map等)来存储和关联相关的数据和行为。

通过“查表”来根据输入参数,确定相应的处理逻辑或结果,从而减少使用大量的条件判断语句。

优点:

1. 提高代码可读性和可维护性:将复杂的逻辑以较为清晰直观的方式呈现。

2. 增强灵活性:可以方便地添加、修改或扩展表中的数据和行为。

3. 减少代码重复:避免了重复编写相似的条件判断代码。

其实本文案例并不算是“表驱动法”的实际应用示例。

但编程思想确是共通的。

SQL数据分析案例,小表驱动大表。

工厂以每天8点00分钟作为当日工作日的起始时间。

业务逻辑:求解今日8点至次日8点,每两个时间段内的设备各种运行状态时长汇总(秒数)。

模板时间阶段:字段包含(开始时间段,结束时间段,开始时间段转化分钟数,结束时间转化分钟数)。

**备注:将工作课表起止时间转换分钟数(分) 分钟数(分)=时*60+分;跨日(次日)+1440;

order_id	|start_time	|end_time	|start_int	|end_int
01		|08:00		|10:00		|0480		|0600
02		|10:00		|12:00		|0600		|0720
03		|12:00		|14:00		|0720		|0840
04		|14:00		|16:00		|0840		|0960
05		|16:00		|18:00		|0960		|1080
06		|18:00		|20:00		|1080		|1200
07		|20:00		|22:00		|1200		  |1320
08		|22:00		|00:00		|1320		  |1440
09		|00:00		|02:00		|1440		  |1560
10		|12:00		|04:00		|1560		  |1680
11		|04:00		|06:00		|1680		  |1800
12		|06:00		|08:00		|1800		|1920

设备状态变化记录表,字段包含(状态标记,开始时间,结束时间)

state_flag	|start_time			|end_time
1		|2024-06-01 07:19:01.000	|2024-06-01 08:09:01.000
2		|2024-06-01 08:09:01.000	|2024-06-01 08:19:01.000
3		|2024-06-01 08:19:01.000	|2024-06-01 09:58:01.000
4		|2024-06-01 09:58:01.000	|2024-06-01 10:02:01.000
2		|2024-06-01 10:02:01.000	|2024-06-01 12:15:01.000
3		|2024-06-01 12:15:01.000	|2024-06-01 13:56:01.000
1		|2024-06-01 13:56:01.000	|2024-06-01 15:45:01.000
3		|2024-06-01 15:45:01.000	|2024-06-01 18:31:01.000
4		|2024-06-01 18:31:01.000	|2024-06-01 20:01:01.000
1		|2024-06-01 20:01:01.000	|2024-06-02 09:01:01.000
2		|2024-06-02 09:01:01.000	|2024-06-08 08:01:01.000
3		|2024-06-08 08:01:01.000	|2024-06-08 12:01:01.000

统计每2个小时时间段的设备各种状态时间,注意设备状态时间可能跨越每两个小时边界值,此时需要将设备状态时间数据拆分为两条。

使用SQL做数据分析: 注意:模板表与设备状态记录表的关联筛选条件,开始结束时间交换关联。

SELECT order_no,start_time,end_time,day_start_time,day_end_time,state_id,/*时长秒数*/SUM(DATEDIFF(SECOND, revised_start_time, revised_end_time)) AS second_sum
FROM (SELECT base.order_no,base.start_time,base.end_time,base.day_start_time,base.day_end_time,state.id AS state_id,state.state_flag,state.start_time AS actual_start_time,state.end_time AS actual_end_time,/*---设备状态时间跨越每两小时边界,将其截取,拆分---*/CASE WHEN state.start_time < base.day_start_time THEN  base.day_start_time ELSE state.start_time END AS revised_start_time,/*---设备状态时间跨越每两小时边界,将其截取,拆分---*/CASE WHEN state.end_time >= base.day_end_time THEN  base.day_end_time ELSE state.end_time END AS revised_end_timeFROM (SELECT CAST(row_no AS int) AS order_no,start_time,end_time,start_int,end_int, DATEADD(MINUTE, start_int, ddtt.date_time) AS day_start_time,DATEADD(MINUTE,   end_int, ddtt.date_time) AS day_end_timeFROM (VALUES(CAST('2024-06-01' AS datetime)))AS ddtt(date_time),demo.segment_model)AS baseLEFT JOIN  demo.demo_state_info AS state/*---状态时间与时间段模板关联条件---*//*-*  注意:模板表与设备状态记录表的关联筛选条件,开始结束时间交换关联。*-*/ON state.start_time <= base.day_end_timeAND state.end_time > base.day_start_time
)AS tmp
GROUP BY 	order_no,start_time,end_time,day_start_time,day_end_time,state_id

 

 

SQL数据分析案例

工厂以每天8点00分钟作为当日工作日的起始时间。

业务逻辑:求解今日8点至次日8点,每两个时间段内的设备各种运行状态时长汇总(秒数)。

模板时间阶段:字段包含(开始时间段,结束时间段,开始时间段转化分钟数,结束时间转化分钟数)。

**备注:将工作课表起止时间转换分钟数(分) 分钟数(分)=时*60+分;跨日(次日)+1440;

order_id	|start_time	|end_time	|start_int	|end_int
01		|08:00		|10:00		|0480		|0600
02		|10:00		|12:00		|0600		|0720
03		|12:00		|14:00		|0720		|0840
04		|14:00		|16:00		|0840		|0960
05		|16:00		|18:00		|0960		|1080
06		|18:00		|20:00		|1080		|1200
07		|20:00		|22:00		|1200		  |1320
08		|22:00		|00:00		|1320		  |1440
09		|00:00		|02:00		|1440		  |1560
10		|12:00		|04:00		|1560		  |1680
11		|04:00		|06:00		|1680		  |1800
12		|06:00		|08:00		|1800		|1920

设备状态变化记录表,字段包含(状态标记,开始时间,结束时间)

state_flag	|start_time			|end_time
1		|2024-06-01 07:19:01.000	|2024-06-01 08:09:01.000
2		|2024-06-01 08:09:01.000	|2024-06-01 08:19:01.000
3		|2024-06-01 08:19:01.000	|2024-06-01 09:58:01.000
4		|2024-06-01 09:58:01.000	|2024-06-01 10:02:01.000
2		|2024-06-01 10:02:01.000	|2024-06-01 12:15:01.000
3		|2024-06-01 12:15:01.000	|2024-06-01 13:56:01.000
1		|2024-06-01 13:56:01.000	|2024-06-01 15:45:01.000
3		|2024-06-01 15:45:01.000	|2024-06-01 18:31:01.000
4		|2024-06-01 18:31:01.000	|2024-06-01 20:01:01.000
1		|2024-06-01 20:01:01.000	|2024-06-02 09:01:01.000
2		|2024-06-02 09:01:01.000	|2024-06-08 08:01:01.000
3		|2024-06-08 08:01:01.000	|2024-06-08 12:01:01.000

统计每2个小时时间段的设备各种状态时间,注意设备状态时间可能跨越每两个小时边界值,此时需要将设备状态时间数据拆分为两条。

使用SQL做数据分析: 注意:模板表与设备状态记录表的关联筛选条件,开始结束时间交换关联。

SELECT order_no,start_time,end_time,day_start_time,day_end_time,state_id,/*时长秒数*/SUM(DATEDIFF(SECOND, revised_start_time, revised_end_time)) AS second_sum
FROM (SELECT base.order_no,base.start_time,base.end_time,base.day_start_time,base.day_end_time,state.id AS state_id,state.state_flag,state.start_time AS actual_start_time,state.end_time AS actual_end_time,/*---设备状态时间跨越每两小时边界,将其截取,拆分---*/CASE WHEN state.start_time < base.day_start_time THEN  base.day_start_time ELSE state.start_time END AS revised_start_time,/*---设备状态时间跨越每两小时边界,将其截取,拆分---*/CASE WHEN state.end_time >= base.day_end_time THEN  base.day_end_time ELSE state.end_time END AS revised_end_timeFROM (SELECT CAST(row_no AS int) AS order_no,start_time,end_time,start_int,end_int, DATEADD(MINUTE, start_int, ddtt.date_time) AS day_start_time,DATEADD(MINUTE,   end_int, ddtt.date_time) AS day_end_timeFROM (VALUES(CAST('2024-06-01' AS datetime)))AS ddtt(date_time),demo.segment_model)AS baseLEFT JOIN  demo.demo_state_info AS state/*---状态时间与时间段模板关联条件---*//*-*  注意:模板表与设备状态记录表的关联筛选条件,开始结束时间交换关联。*-*/ON state.start_time <= base.day_end_timeAND state.end_time > base.day_start_time
)AS tmp
GROUP BY 	order_no,start_time,end_time,day_start_time,day_end_time,state_id

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/34140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

执行shell脚本出现 $‘ \r‘ 符号导致执行失败【解决】

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

深信服AC行为管理报错

报错信息&#xff1a; e0:alarmevent.cpp:54 exec cmd: /ac/common/app/kvupd -v failed 说明&#xff1a; 截止到上网行为管理12.0.80及全网行为管理13.0.102版本&#xff0c;AC凌晨&#xff08;0点-7点&#xff09;会重启进程让设备更好的运行&#xff0c;凌晨重启告警属于正…

Leetcode刷题(四十二)

美丽下标对的数目&#xff08;Easy&#xff09; 给你一个下标从 0 开始的整数数组 nums 。如果下标对 i、j 满足 0 ≤ i < j < nums.length &#xff0c;如果 nums[i] 的 第一个数字 和 nums[j] 的 最后一个数字 互质 &#xff0c;则认为 nums[i] 和 nums[j] 是一组 美丽…

unity基础 常用的API及脚本模板

对于刚学unity的新手&#xff0c;c#脚本基础尤为重要&#xff0c;一文带你搞定一些简单实用的小脚本&#xff0c;让你轻松入门。 常用的API &#xff08;部分源于网络&#xff0c;侵权滴删&#xff09; 1.Transform Transform是用于控制游戏对象位置、旋转和缩放的组件。其AP…

android 彩虹进度条自定义view实现

实现一个彩虹色进度条功能&#xff0c;不说明具体用途大家应该能猜到。想找别人造的轮子&#xff0c;但是没有合适的&#xff0c;所以决定自己实现一个。 相关知识 android 自定义view LinearGradient 线性渐变 实现步骤 自定义view 自定义一个TmcView类继承View 重写两…

SpringBoot系列之搭建WebSocket应用

SpringBoot系列之@ServerEndpoint方式开发WebSocket应用。在实时的数据推送方面,经常会使用WebSocket或者MQTT来实现,WebSocket是一种不错的方案,只需要建立连接,服务端和客户端就可以进行双向的数据通信。很多网站的客户聊天,也经常使用WebSocket技术来实现。 WebSocket…

npm error code EUNSUPPORTEDPROTOCOL 解决

更换包管理工具 npm i -g pnpm pnpm install pnpm run dev 参考 https://blog.csdn.net/qq_42592823/article/details/137541827

Mac角色扮演游戏推荐:仙剑奇侠传四 for Mac 安装包

《仙剑奇侠传四》拥有精美的画面、优秀的音乐和丰富的剧情内容&#xff0c;成为了仙剑系列中的经典作品之一。游戏在发行后获得了极高的口碑和销量&#xff0c;成为了仙剑系列中的经典之作。在游戏中&#xff0c;玩家将扮演不同的角色&#xff0c;进行冒险探索、与各种敌人战斗…

# bash: chkconfig: command not found 解决方法

bash: chkconfig: command not found 解决方法 一、chkconfig 错误描述&#xff1a; 这个错误表明在 Bash 环境下&#xff0c;尝试执行 chkconfig 命令&#xff0c;但是系统找不到这个命令。chkconfig 命令是一个用于管理 Linux 系统中服务的启动和停止的工具&#xff0c;通常…

2024 年网站分析必备:Fullstory、APILayer 及 Openinstall API 服务

在当今数字化的时代&#xff0c;网站和应用的成功运营离不开对用户行为和网站性能的深入洞察。2024 年的今天&#xff0c;随着技术的不断发展&#xff0c;各种先进的 API 服务应运而生&#xff0c;为我们提供了强大的工具来优化用户体验、保障网站可用性以及提升 App 推广效果。…

Linux编译器 gcc/g++

gcc/g的简介 GCC&#xff08;英文全拼&#xff1a;GNU Compiler Collection&#xff09;是 GNU 工具链的主要组成部分&#xff0c;是一套以 GPL 和 LGPL 许可证发布的程序语言编译器自由软件&#xff0c;由 Richard Stallman 于 1985 年开始开发。gcc是GCC中的C语言编译器&…

ES6及其后续版本的新特性的理解

ES6及其后续版本&#xff08;如ES7、ES8等&#xff09;的新特性的理解 ES6&#xff08;ECMAScript 2015&#xff09;引入了一系列重要的语言和语法特性&#xff0c;旨在提升JavaScript的简洁性和可读性。后续的ES7、ES8等版本继续扩展了这些特性。以下是一些关键新特性&#x…

爱迪特两年创业板上市路:销售费用率远高同行,侵权风险引关注

《港湾商业观察》施子夫 王璐 从2022年4月7日就冲刺创业板的爱迪特&#xff08;秦皇岛&#xff09;科技股份有限公司&#xff08;以下简称&#xff0c;爱迪特&#xff09;&#xff0c;预计将很快登陆资本市场。 爱迪特日前披露中签结果&#xff1a;本次发行股份数量为约1902…

关于最强模型Claude 3.5 Sonnet,你需要知道的10条总结!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识,包括但不限于AI科普,AI工具测评,AI效率提升,AI行业洞察。关注我,AI之…

Python自动化(8)——pyqt5界面

Python自动化(8)——pyqt5界面 注意&#xff1a;pyqt5的界面使用时必须有app QApplication(sys.argv)这行代码&#xff0c;否则会出现错误并且无法显示窗口&#xff1a;QWidget: Must construct a QApplication before a QWidget 一些基础的控件 QMainWindow QMainWindow是…

Java NIO Buffer概念

针对每一种基本类型的 Buffer &#xff0c;NIO 又根据 Buffer 背后的数据存储内存不同分为了&#xff1a;HeapBuffer&#xff0c;DirectBuffer&#xff0c;MappedBuffer。 HeapBuffer 顾名思义它背后的存储内存是在 JVM 堆中分配&#xff0c;在堆中分配一个数组用来存放 Buffe…

【经验分享】免费版虚拟机VMware Workstation Pro 17下载方式

【经验分享】免费版虚拟机VMware Workstation Pro 17下载方式 前言一、免费虚拟机下载方式二、 安装过程总结 前言 我真的是服了&#xff0c;现在的CSDN时效性为什么这么差了。都快一个月了还没有博主更新个人免费版虚拟机VMware Workstation Pro&#xff0c;甚至很多人还不知…

【运维】使用 Docker Compose 快速启动项目全流程指南

文章目录 docker-compose启动项目流程1. 安装 Docker 和 Docker Compose2. 准备 Docker Compose 文件3. 启动 Docker Compose 服务4. 检查运行状态5. 停止服务示例 docker-compose.yaml 文件 为什么要用docker-compose1. 微服务架构的实现2. 依赖管理3. 简化开发和测试环境4. 方…

RFID技术在汽车轮胎加工工艺中的革新应用

RFID技术在汽车轮胎加工工艺中的革新应用 物联网技术的飞速发展&#xff0c;无线射频识别&#xff08;Radio Frequency Identification&#xff0c;简称RFID&#xff09;技术因其独特的优势&#xff0c;在各行各业中展现出巨大的应用潜力。特别是在汽车制造业&#xff0c;RFID…

推荐一款好用的浏览器翻译插件——欧路翻译

近些年&#xff0c;机器翻译的效果越来越好&#xff0c;于是也有更多的开发者&#xff0c;开发了免费使用的浏览器翻译插件。这大大的帮助了我们查看国外的网站&#xff0c;有利于大家获取更多的信息。 在此&#xff0c;给大家推荐一款免费好用的浏览器插件——欧路翻译。支持…