MYSQL:删除指定时间范围内每个电站每天发电数据除最大值以外的记录

news2024/9/25 21:24:05

有一个需求,需要保留每个电站每一天发电数据的最大值记录,其余删除。

表数据大概长这样:

MYSQL 5.7写法:(因为不支持ROW_NUMBER()函数,采用自定义的变量来代替

首次清理一年内数据:INTERVAL 365 DAY
清理前一日数据:INTERVAL 1 DAY
    
-----------------   
    
DELETE A   
FROM power_app_data_log A  
WHERE NOT EXISTS (  
    SELECT 1  
    FROM (  
        SELECT  
            t.id,  
            IF(  
                @prev_brand_id = t.brand_id AND @prev_time = DATE(t.TIME),  
                @num := @num + 1,  
                @num := 1  
            ) AS row_no,  
            @prev_brand_id := t.brand_id,  
            @prev_time := DATE(t.TIME)  
        FROM  
            power_app_data_log t,  
            (SELECT @num := 0, @prev_brand_id := NULL, @prev_time := NULL) AS vars  
        WHERE  
            DATE(t.TIME) BETWEEN DATE_SUB(CURDATE(), INTERVAL 365 DAY) AND CURDATE()  
        ORDER BY  
            t.brand_id,  
            DATE(t.TIME),  
            t.app_data DESC  
    ) AS subquery  
    WHERE subquery.row_no = 1 AND A.id = subquery.id  
)
AND DATE(A.TIME) BETWEEN DATE_SUB(CURDATE(), INTERVAL 365 DAY) AND CURDATE();
    
这段SQL代码的目的是删除power_app_data_log表中一些特定的记录。下面是对这段SQL的详细解释:

外层查询:
DELETE A FROM power_app_data_log A:这表示将从power_app_data_log表中删除记录,别名为A。

WHERE子句:
WHERE NOT EXISTS (...):这表示将删除那些在内层查询中不存在的记录。


内层查询:
这是一个子查询,用于找出每个brand_id和日期组合中的最新记录(基于app_data的降序排序)。
使用了变量@num、@prev_brand_id和@prev_time来跟踪每个brand_id和日期组合中的记录序号。
IF语句用于判断当前记录的brand_id和日期是否与前一条记录相同,如果相同则序号加1,否则序号重置为1。
ORDER BY t.brand_id, DATE(t.TIME), t.app_data DESC:这表示按照brand_id、日期和app_data的降序进行排序。


子查询的WHERE子句:
WHERE subquery.row_no = 1 AND A.id = subquery.id:这表示只选择每个brand_id和日期组合中的第一条记录(即最新记录),并且这条记录的id必须与外层查询中的id相匹配。


外层查询的额外条件:
AND DATE(A.TIME) BETWEEN DATE_SUB(CURDATE(), INTERVAL 365 DAY) AND CURDATE();:这表示只考虑在过去365天内的记录。


综上所述,这段SQL代码的作用是删除power_app_data_log表中在过去365天内,但不是每个brand_id和日期组合中的最新记录的所有记录。换句话说,它保留了每个brand_id和日期组合中的最新记录,删除了其余的记录。

MYSQL 8.0写法:

DELETE A  
FROM power_app_data_log A  
WHERE NOT EXISTS (  
    SELECT 1  
    FROM (  
        SELECT  
            t.id,  
            ROW_NUMBER() OVER (  
                PARTITION BY t.brand_id, DATE(t.TIME)  
                ORDER BY t.app_data DESC  
            ) AS row_no  
        FROM  
            power_app_data_log t  
        WHERE  
            DATE(t.TIME) BETWEEN DATE_SUB(CURDATE(), INTERVAL 365 DAY) AND CURDATE()  
    ) AS subquery  
    WHERE subquery.row_no = 1 AND A.id = subquery.id  
)  
AND DATE(A.TIME) BETWEEN DATE_SUB(CURDATE(), INTERVAL 365 DAY) AND CURDATE();
这段SQL代码的目的是删除power_app_data_log表中一些特定的记录,具体解释如下:

外层查询:
DELETE A FROM power_app_data_log A:表示将从power_app_data_log表中删除记录,别名为A。


WHERE子句:
WHERE NOT EXISTS (...):表示将删除那些在内层查询中不存在的记录。


内层查询:
这是一个子查询,用于找出每个brand_id和日期组合中的最新记录(基于app_data的降序排序)。
使用了ROW_NUMBER()窗口函数来为每个brand_id和日期组合中的记录分配一个序号,序号是基于app_data的降序排序的。
PARTITION BY t.brand_id, DATE(t.TIME):表示窗口函数将按照brand_id和日期进行分区。
ORDER BY t.app_data DESC:表示在每个分区内,记录将按照app_data的降序进行排序。


子查询的WHERE子句:
WHERE subquery.row_no = 1 AND A.id = subquery.id:表示只选择每个brand_id和日期组合中的第一条记录(即最新记录),并且这条记录的id必须与外层查询中的id相匹配。


外层查询的额外条件:
AND DATE(A.TIME) BETWEEN DATE_SUB(CURDATE(), INTERVAL 365 DAY) AND CURDATE();:表示只考虑在过去365天内的记录。


综上所述,这段SQL代码的作用是删除power_app_data_log表中在过去365天内,但不是每个brand_id和日期组合中的最新记录的所有记录。换句话说,它保留了每个brand_id和日期组合中的最新记录,删除了其余的记录。这是通过比较每条记录的id是否存在于一个只包含每个组合中最新记录的子查询中来实现的。如果不存在,则删除该记录。

   

扩展:

MySQL之group by与max()一起使用的坑

MYSQL之not in优化方法:left join

mysql 优化 not in优化成not exist

 

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

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

相关文章

5是否有路通向AGI

5.1是否有路通向AGI

如何在算家云搭建模型Stable-diffusion-webUI(AI绘画)

一、Stable Diffusion WebUI简介 Stable Diffusion WebUI 是一个网页版的 AI 绘画工具,基于强大的绘画模型Stable Diffusion ,可以实现文生图、图生图等。 二、模型搭建流程 1.选择主机和镜像 (1)进入算家云的“应用社区”&am…

一本书加印19次,回答小伙伴们几个写书的疑问

前几天又有一个高校老师加松哥微信,表示本学期选了松哥的书做教材: 松哥在 2019 年 1 月份出版了《Spring BootVue 全栈开发实战》这本书,到现在已经是第六年了。 今年 1 月份收到出版社稿酬的时候,我特意去看了下稿酬通知单&…

渣土车识别算法解决城市治理难题

随着城市化进程的加速,渣土车作为建筑工程中不可或缺的运输工具,其频繁的穿行和装载运输过程往往引发一系列问题,如超载、扬尘污染、乱倒渣土等,对城市环境和交通秩序造成了不良影响。为了解决这些问题,采用基于视觉分…

一文教你StableDiffusion图生图批量处理!

今天给大家讲解一下SD图生图的批量处理功能应该如何使用~ 一、图生图批量处理功能的基本用法 首先打开webUI,在图生图页面下我们先找到批量处理的菜单: 最简单的批量处理方法只需要用到【输入目录】和【输出目录】两个功能: 第一…

Java:正则表达式 matches

文章目录 正则表达式作用基本用法小结代码 案例:校验用户输入的电话,邮箱,是否合法\\.是什么意思 黑马学习笔记 正则表达式 由一些特定的字符组成,代表的是一个规则 作用 用来校验数据格式是否合法在一段文本中查找满足要求的内…

计算机毕业设计选题推荐-高校科研工作管理系统-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

【GIS开发小课堂】vue3+Cesium.js三维WebGIS项目实战(一)

随着市场对数字孪生的需求日益增多,对于前端从业者的能力从对框架vue、react的要求,逐步扩展到2D、3D空间的交互,为用户提供更紧密的立体交互。近年来前端对GIS的需求日益增多。 本文档详细介绍了使用Vue3和Cesium.js构建三维WebGIS项目的步骤…

数据结构07

文章目录 二叉树的坡度二叉树的右视图 二叉树的坡度 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), l…

配置vscode终端自动激活anaconda的python环境

前言 每次使用vscode写python代码的时候,都需要在外面跑一个anaconda prompt,激活环境,然后进入对应的文件夹,运行代码,特别麻烦,所以想,能不能直接在vscode终端里面激活环境然后运行。 第一步…

FIFO求和实验

前言 FIFO(先进先出)队列在图像处理中的应用非常广泛,特别是在需要处理实时数据流和保证数据顺序的场景中。以下是一些具体应用实例:在实时视频流处理中,FIFO队列用于缓存图像帧。这样可以确保图像数据按照捕获顺序被处…

828华为云征文|华为云Flexus X实例docker部署harbor镜像仓库

828华为云征文|华为云Flexus X实例docker部署harbor镜像仓库 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定不要错…

如何培养积极的心态:策略与建议

积极的心态是通往幸福与成功的关键。它不仅影响着我们的日常生活质量,还决定了我们在面对困难时的态度和反应。本文将介绍一些实用的方法,帮助你建立并维持一种积极向上的生活态度。 积极心态的意义 拥有积极心态的人往往能够: 更快地恢复…

avi转换成mp4,这6种方法助你快速转换

视频格式的兼容性一直是用户关注的焦点。AVI作为一种较老的视频格式,虽然在一些特定场合下仍有应用,但MP4格式因其广泛的兼容性和较小的文件体积,已成为主流的视频格式。本文将详细介绍六种将AVI转换成MP4的方法,一起来了解下吧。…

安卓手机照片误删? 2024最新恢复办法分享

不小心将安卓手机照片误删了,该怎么办呢?相信不少人都遇到过类似困扰,别担心,下面小编就分享几种华为手机数据恢复办法,助大家快速找回误删照片。 方法一:从「回收站」中恢复照片 安卓手机通常都具备回收站…

17 连接池原理

可以设计一个mysql的连接池,提高效率 提前建立一个连接池,这里面创建线程池,和mysql建立连接,维护一个任务队列。有任务到来时,将任务放入任务队列,任务结构是要执行的sql语句和需要的回调函数&#xff0c…

信息化项目验收测试的必要性,第三方软件测评机构的进行步骤

随着信息化时代的到来,各类软件项目在企业中得到了越来越广泛的应用。为了保障项目的顺利交付,确保软件系统的功能、性能和稳定性,验收测试成为了一个不可或缺的环节。 一、信息化项目验收测试   信息化项目验收测试是对软件项目最终成果进…

py脚本 银行帐号格式化显示4个数字一组

假设你想要将银行帐号以某种特定的格式(例如,每 4 位数字加一个空格)进行格式化。 示例代码 以下是一个示例 Python 脚本,将银行帐号格式化为每 4 位数字加一个空格的形式: def format_bank_account(account_number…

CSS实现文字环绕圆形展示

展示区域 代码区域 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><s…

Webpack详解与配置环境

webpack&#xff1a;webpack网址 1、工作原理&#xff1a; Webpack是一个非常强大的静态模块的打包工具。从文件入口开始&#xff0c;递归解析以来关系&#xff0c;然后将所有模块打包成一个或多个budle文件。 2、webpack核心概念&#xff1a; Entry&#xff1a;入口起点(en…