【Mysql实战】使用存储过程和计算同比环比

news2024/10/6 6:04:55

背景

同环比,是基本的数据分析方法。在各类调研表中屡见不鲜,如果人工向前追溯统计数据,可想而知工作量是非常大的。

标题复制10行,并且每行大于10个字符【源码解析】SpringBoot接口参数【Mysql实战】使用存储过程和计算同比环比校验原理

实战

以任务表为例,创建任务表。

-- auto-generated definition
create table app_task
(
    id           bigint auto_increment comment '主键'
        primary key,
    user_id      int               null comment '当前执行人',
    user_name    varchar(24)       null comment '当前执行人名字',
    arrival_time datetime          null comment '到达时间',
    start_time   datetime          null comment '开始时间',
    finish_time  datetime          null comment '完成时间',
    expect_time  datetime          null comment '预计时间',
    create_time  datetime          null comment '创建时间',
    is_delete    tinyint default 0 null comment '0-生效,1-失效'
)
    comment '任务表';
标题复制10行,并且每行大于10个字符【源码解析】SpringBoot接口参数【Mysql实战】使用存储过程和计算同比环比校验原理

存储过程插入数据

使用存储过程导入数据,开始时间是凌晨,结束时间是23点,创建时间和到达时间为当前,预期时间为变换的字符串。

CREATE PROCEDURE `batch_insert_data`(
    IN count INTEGER, -- record参数用来传需要插入数据的条数
    IN dt timestamp -- dt参数用来传入时间戳,开始插入的第一条数据的时间(格式为:'2020-10-24 14:31:44')
)
BEGIN
    DECLARE number INTEGER; -- 声明一个number,用来控制循环的次数
    set number = 1; -- 将number的值赋值为1,代表循环从1开始
    START TRANSACTION;
    WHILE number <= count
        DO
            -- 使用while进行循环,满足条件进入循环
            select date_add(dt, interval 1 second) into dt;
            -- 使用date_add()函数将时间进行转换为秒数,并赋值给dt参数
-- 插入数据
            INSERT INTO app_task -- 库名.表名
-- 由于id是自动增长,不需要额外赋值,所以需要将剩余的其他字段全部列出进行一一对应赋值插入
            (user_id,
             user_name,
             arrival_time,
             start_time,
             finish_time,
             expect_time,
             create_time,
             is_delete)
            VALUES (FLOOR(RAND() * 10),
                    2,
                    now(),
                    DATE_FORMAT(CURDATE(),'%Y-%m-%d %H:%i:%s'),
                    DATE_ADD(CURDATE(), INTERVAL 23 HOUR),
                    dt,
                    now(),
                    0);
-- number参数进行自增
            set number = number + 1;
-- dt参数进行自增
            set dt = date_add(dt, interval 1 second);
        end WHILE;
    COMMIT;
END;
标题复制10行,并且每行大于10个字符【源码解析】SpringBoot接口参数【Mysql实战】使用存储过程和计算同比环比校验原理

日期常用函数(重点:每周)

SELECT DATE_SUB(CURDATE(),INTERVAL 1 DAY);     	-- 昨天
SELECT DATE_SUB(CURDATE(),INTERVAL 1 MONTH);     -- 上个月
SELECT DATE_ADD(CURDATE(), INTERVAL 9 HOUR);    -- 当天9点
SELECT NOW();-- 查询当时
SELECT CURDATE();-- 查询当天
select yearweek('2023-05-12 09:00:00'),week('2023-05-12 09:00:00'),weekofyear('2023-05-12 09:00:00'),weekday('2023-05-12 09:00:00') ; ;
-- 202319,19,19,4

select yearweek(now() - INTERVAL 1 DAY)    -- 从周1开始本周计算
--  yearweek、WEEK (日期)  是 每把周日,作为一周的开始。
标题复制10行,并且每行大于10个字符【源码解析】SpringBoot接口参数【Mysql实战】使用存储过程和计算同比环比校验原理

删除和调用存储过程

-- 删除存储过程
drop procedure batch_insert_data;
-- 调用存储过程
call batch_insert_data(20,now());

按照月份和人员id,统计每个人每月的完成任务时长,延迟数量,延迟百分比,完成任务数量。

  • 使用left(create_time, 7),按照日期排序
select user_id userId,
             left(create_time, 7)                                        yyyyMM,
             ROUND(avg(TIMESTAMPDIFF(MINUTE, start_time, finish_time)), 2)    finishDuration,
             sum(if(arrival_time > expect_time, 1, 0))                       delayCount,
             round(sum(if(arrival_time > expect_time, 1, 0)) / count(id), 2) delayPercent,
             count(id)                                                     taskCount
      from app_task
      group by userId, left(create_time, 7)
      order by userId, left(create_time, 7);
标题复制10行,并且每行大于10个字符【源码解析】SpringBoot接口参数【Mysql实战】使用存储过程和计算同比环比校验原理

计算月环比

计算当月完成的任务量,任务量的月环比;计算当月完成任务的平均时长,平均时长的月环比;计算当月的延迟率,延迟率的月环比

  • WINDOW w AS (PARTITION BY userId ORDER BY yyyyMM),指定窗口别名
  • 使用窗口函数lag,获取分组中的前一条数据。
select *
from (
         select yyyyMM,
                userId,
                taskCount,
                LAG(taskCount, 1) OVER w      AS                                                     lastTaskCount,
                round((taskCount - LAG(taskCount, 1) OVER w) / LAG(taskCount, 1) OVER w, 2)          taskCountChain,
                finishDuration,
                LAG(finishDuration, 1) OVER w AS                                                     lastfinishDuration,
                round((finishDuration - LAG(finishDuration, 1) OVER w) / LAG(finishDuration, 1) OVER w,
                      2)                                                                             finishDurationChain,
                delayCount,
                LAG(finishDuration, 1) OVER w AS                                                     lastDelayCount,
                delayPercent,
                LAG(delayPercent, 1) OVER w   AS                                                     lastDelayPercent,
                round((delayPercent - LAG(delayPercent, 1) OVER w) / LAG(delayPercent, 1) OVER w, 2) delayPercentChain
         from (select user_id                                                         userId,
                      left(create_time, 7)                                            yyyyMM,
                      ROUND(avg(TIMESTAMPDIFF(MINUTE, start_time, finish_time)), 2)   finishDuration,
                      sum(if(arrival_time > expect_time, 1, 0))                       delayCount,
                      round(sum(if(arrival_time > expect_time, 1, 0)) / count(id), 2) delayPercent,
                      count(id)                                                       taskCount
               from app_task
               group by userId, left(create_time, 7)
               order by userId, left(create_time, 7)) t1
             WINDOW w AS (PARTITION BY userId ORDER BY yyyyMM)) tmp
where tmp.yyyyMM = '2023-05';
标题复制10行,并且每行大于10个字符【源码解析】SpringBoot接口参数【Mysql实战】使用存储过程和计算同比环比校验原理

计算月同比

核心是比较前12月的数据,LAG(finishDuration, 12) OVER w

标题复制10行,并且每行大于10个字符【源码解析】SpringBoot接口参数【Mysql实战】使用存储过程和计算同比环比校验原理

使用WITH AS简化SQL

WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到。有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数据的部分。

with statistics as (
    select user_id                                                         userId,
           left(create_time, 7)                                            yyyyMM,
           ROUND(avg(TIMESTAMPDIFF(MINUTE, start_time, finish_time)), 2)   finishDuration,
           sum(if(arrival_time > expect_time, 1, 0))                       delayCount,
           round(sum(if(arrival_time > expect_time, 1, 0)) / count(id), 2) delayPercent,
           count(id)                                                       taskCount
    from app_task
    group by userId, left(create_time, 7)
    order by userId, left(create_time, 7)
),
     tmp as (
         select yyyyMM,
                userId,
                taskCount,
                LAG(taskCount, 1) OVER w      AS                                                     lastTaskCount,
                round((taskCount - LAG(taskCount, 1) OVER w) / LAG(taskCount, 1) OVER w, 2)          taskCountChain,
                finishDuration,
                LAG(finishDuration, 1) OVER w AS                                                     lastfinishDuration,
                round((finishDuration - LAG(finishDuration, 1) OVER w) / LAG(finishDuration, 1) OVER w,
                      2)                                                                             finishDurationChain,
                delayCount,
                LAG(finishDuration, 1) OVER w AS                                                     lastDelayCount,
                delayPercent,
                LAG(delayPercent, 1) OVER w   AS                                                     lastDelayPercent,
                round((delayPercent - LAG(delayPercent, 1) OVER w) / LAG(delayPercent, 1) OVER w, 2) delayPercentChain
         from statistics
             WINDOW w AS (PARTITION BY userId ORDER BY yyyyMM)
     )
select *
from tmp
where tmp.yyyyMM = '2023-05';
标题复制10行,并且每行大于10个字符【源码解析】SpringBoot接口参数【Mysql实战】使用存储过程和计算同比环比校验原理

关联查询

如果在记录表app_task_record记录状态和创建时间,当任务开始时,插入一条状态30的数据,当任务结束时,插入一条状态90的数据。计算当前任务的完成时间。

select max(if(task_status = '30', create_time, null))                startTime,
       max(if(task_status = '90', create_time, null))                finishTime,
       TIMESTAMPDIFF(MINUTE, max(if(task_status = '30', create_time, null)),
                     max(if(task_status = '90', create_time, null))) time_consuming
from app_task_record
where task_id = 1;
标题复制10行,并且每行大于10个字符【源码解析】SpringBoot接口参数【Mysql实战】使用存储过程和计算同比环比校验原理

在这里插入图片描述

标题复制10行,并且每行大于10个字符【源码解析】SpringBoot接口参数【Mysql实战】使用存储过程和计算同比环比校验原理
标题复制10行,并且每行大于10个字符【源码解析】SpringBoot接口参数【Mysql实战】使用存储过程和计算同比环比
标题复制10行,并且每行大于10个字符【源码解析】SpringBoot接口参数【Mysql实战】使用存储过程和计算同比环比校验原理
标题复制10行,并且每行大于10个字符【源码解析】SpringBoot接口参数【Mysql实战】使用存储过程和计算同比环比校验原理
标题复制10行,并且每行大于10个字符【源码解析】SpringBoot接口参数【Mysql实战】使用存储过程和计算同比环比校验原理

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

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

相关文章

超全总结:硬件设计基础60条

硬件是一个非常复杂的系统&#xff0c;在设计过程中都会遇到或多或少的问题&#xff0c;本文中总结了非常基础的60个问题&#xff0c;供大家参考。 1、请说明一下滤波磁珠和滤波电感的区别。 磁珠由导线穿过铁氧体组成&#xff0c;直流电阻很小&#xff0c;在低频时阻抗也很小…

数字化转型,目的是为了转型还是数字化?

受第四次工业革命浪潮的影响&#xff0c;传统工业经济社会快速向数字经济转型过渡&#xff0c;企业创新面临的经济环境发生根本性变革。数字技术广泛应用于生产、交换、消费等经济环节&#xff0c;为企业产品创新、服务创新以及数字化开放式创新提供了动力源泉。数字经济背景下…

如何利用生产管理系统提高粉末治金工业的生产调度能力

在粉末冶金工业中&#xff0c;生产管理系统的应用已经成为了一个必不可少的部分。生产管理系统可以帮助企业实现自动化、信息化、智能化的生产&#xff0c;提高生产效率、降低生产成本、提高产品质量。生产管理系统可以对生产流程进行全面的监控和管理&#xff0c;从而实现生产…

11个超好用的SVG编辑工具

SVG的优势在于SVG图像可以更加灵活&#xff0c;自由收缩放大而不影响图片的质量&#xff0c;一个合适的SVG编辑工具能够让你的设计事半功倍&#xff0c;下面就一起来看看这些冷门软件好用在哪里。这11个超好用的SVG编辑工具依次为&#xff1a;即时设计、Justinmind、Sketsa SVG…

Sentinel-Dashboard-1.8持久化Nacos

Sentinel-Dashboard-1.8持久化Nacos 目录 Sentinel-Dashboard-1.8持久化Nacos一、客户端改造1.引入pom.xml文件依赖2.配置application.yml文件。 二、Sentinel-Dashboard源码改造三、测试 一、客户端改造 1.引入pom.xml文件依赖 <!-- https://mvnrepository.com/artifact/…

这些神奇的AI智能机器人很早就已出现过,你确定你不了解?

很多人自从ChatGPT出现以后&#xff0c;就总是担忧&#xff0c;担心自己的职业被影响&#xff0c;然后很多人大肆宣扬 ChatGPT 真是了不得&#xff0c;未来再辅助机器人&#xff0c;加上大数据&#xff0c;一定可以怎么怎么样&#xff0c;说的神乎其神&#xff0c;说实话&#…

几个pdf怎么合并在一起?

几个pdf怎么合并在一起&#xff1f;在日常生活和工作中&#xff0c;我们可能会遇到需要将多个PDF文件合并为一个文件的问题。在对PDF文件合并之后&#xff0c;能够更好地组织和管理信息。将pdf文件合并能够在很大程度上提高工作效率&#xff0c;减少查找和打开不同文件的时间。…

【计算机视觉 | ViT-G】谷歌大脑提出 ViT-G:缩放视觉 Transformer,高达 90.45% 准确率

文章目录 一、简介二、如何做到的&#xff1f;三、扩展数据四、「head」 的解耦权重衰减五、通过移除 [class] token 节省内存六、实验结果6.1 将计算、模型和数据一起扩展6.2 ViT-G/14 结果 论文地址为&#xff1a; https://arxiv.org/pdf/2106.04560.pdf一、简介 视觉 Trans…

PoseiSwap合规、隐私与支持更广泛的资产

Nautilus Chain 代表了公链赛道发展的一个新的范式形态&#xff0c;作为目前行业内首个 Layer3 链&#xff0c;是目前行业内第一个并行化且运行速度最快的EVM Rollup 方案。作为首个模块化链&#xff0c;存储、计算、共识等都在不同的模块中&#xff0c;意味着其能够获得更高的…

如何建立DDR3测试工程

要建立DDR3的测试工程&#xff0c;首先要生成mig IP核&#xff0c;然后写测试模块使用这个IP核进行测试。 一、生成 mig IP核 建立一个新工程&#xff0c;然后生成 mig IP核。 关键步骤如下&#xff1a; &#xff08;1&#xff09;点击 IP catalog&#xff0c;在搜索框输入…

SSM框架学习-AOP通知类型

在AOP中&#xff0c;通知&#xff08;Advice&#xff09;是对切点进行操作的方法&#xff0c;用于实现切面定义的具体逻辑。Spring框架支持五种类型的通知&#xff1a; 1. 前置通知&#xff08;Before advice&#xff09; 在连接点执行前&#xff0c;执行通知 Before("**…

【跟着陈七一起学C语言】今天总结:C语言的结构体和其它数据形式

友情链接&#xff1a;专栏地址 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的错误&#x…

OpenGL高级-立方体贴图

运行效果 源代码 着色器 渲染物体的顶点着色器&#xff1a; #version 330 core // 传入局部坐标下的顶点坐标 layout( location 0 ) in vec3 position; layout (location 1) in vec2 texCoords;// 传入变换矩阵 uniform mat4 model; uniform mat4 view; uniform mat4 proje…

d2l的一些理论知识的整理【1】

目录 考试知识整理引言2 预备知识2.1. 数据操作2.2. 数据预处理2.3. 线性代数2.4. 微积分2.5. 自动微分2.6. 概率2.7. 查阅文档 3 线性神经网络3.1. 线性回归3.2. 线性回归的从零开始实现3.3. 线性回归的简洁实现3.4. softmax回归3.5. 图像分类数据集3.6. softmax回归的从零开始…

AT24C16页写和多页写

AT24C16 2K字节(存储内存) 128&#xff08;页面数&#xff09;* 16 &#xff08;每页的字节数&#xff09; 2^11 (寻址地址位数 11位)。 AT24C16有128(2^7128)页只需要7位地址&#xff0c;分为高3位和低4位&#xff0c;高3位在设备地址中&#xff0c;低4位在字地址中。 设备…

Flutter GetX Tag 属性使用详解

Flutter GetX Tag 属性使用详解 了解 Flutter GetX Tag 属性的定义、用途、实现方式和常见问题。 前言 Flutter中&#xff0c;GetX是一款非常流行的状态管理库。它不仅提供了状态管理的功能&#xff0c;还有路由、依赖注入和许多其他功能。在这篇文章中&#xff0c;我将介绍如…

Node.js简易教程

目录 介绍 fs模块 演示 writeFile 异步写入 appendFile/appendFileSync 追加写入 createWriteStream流式写入 readFile异步读取文件/readFileSync同步读取文件 createReadStream流式读取 文件移动与重命名 文件删除 http模块 创建服务 url 格式化 获取静态文件服务 node模…

“卷爆了“的IT互联网行业,为啥至今还有人头铁往里冲?

细数互联网过往的发展史&#xff0c;造就了成千上万的企业家、创业者&#xff0c;众多职场人趋之若鹜地选择互联网行业&#xff0c;想从这个领域捞一桶金。 但不知道从什么时候开始&#xff0c;一篇篇关于互联网红利消失&#xff0c;流量枯竭的文章接踵而至&#xff0c;现在转…

没关系,前端还死不了

前言 网络上的任何事情都可以在《乌合之众》书中找到答案。大众言论没有理性&#xff0c;全是极端&#xff0c;要么封神&#xff0c;要么踩死。不少人喷前端&#xff0c;说前端已死&#xff1f;前端内卷&#xff1f;前端一个月800包吃住&#xff1f; 对此我想说&#xff0c;“…

【python】批量采集次元岛cos美图,只是为了学习~

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 这里写目录标题 前言开发环境:模块使用:代码展示美图欣赏尾语 &#x1f49d; 开发环境: Python 3.8 Pycharm 模块使用: 第三方模块 需要安装 在cmd里面 进行 pip install requests requests >>> 数据请求模块 …