【MySQL】窗口函数实现滑动平均计算,数据清洗缺失值填补均值


路过了学校花店
荒野到海边
有一种浪漫的爱
是浪费时间
徘徊到繁华世界
才发现你背影
平凡得特别
绕过了城外边界
还是没告别
爱错过了太久
反而错得完美无缺
幸福兜了一个圈

                     🎵 林宥嘉《兜圈》


在数据分析和处理过程中,常常需要对一系列时间序列数据进行处理,例如计算滑动平均值。这篇博客将通过一个具体的SQL查询案例,展示如何利用SQL窗口函数来实现这一目标。

案例背景

假设我们有一个名为user_balance的表,记录了用户的账户余额信息。该表的结构如下:

  • user_id:用户ID
  • op_time:操作时间
  • balance:账户余额
    我们的目标是计算每个用户在特定时间点的余额,如果余额缺失,则使用滑动窗口内的平均余额来填补。具体地,我们希望在特定日期2023-06-01获取每个用户的余额或滑动平均余额。

SQL 查询解释

下面是实现这一需求的SQL查询:

SELECTuser_id,op_time,COALESCE(balance, avg_balance) AS balance
FROM (SELECTuser_id,op_time,balance,AVG(balance) OVER (PARTITION BY user_idORDER BY op_timeROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS avg_balanceFROMuser_balance
) AS subquery
WHEREop_time = '2023-06-01'
ORDER BYuser_id, op_time;

查询分解

  1. 内部查询:

    首先,我们在内部子查询中使用窗口函数AVG()计算每个用户在操作时间窗口内的平均余额。
    PARTITION BY user_id:将数据按用户ID分区,确保每个用户的计算是独立进行的。
    ORDER BY op_time:按操作时间排序,确保计算的滑动窗口是基于时间顺序的。
    ROWS BETWEEN 2 PRECEDING AND CURRENT ROW:定义窗口范围为当前行及前两行。

  2. 外部查询:

    使用COALESCE(balance, avg_balance)函数来处理缺失值,如果balance为空,则使用avg_balance替代。
    过滤出在特定日期2023-06-01的数据。
    最后按用户ID和操作时间排序,确保结果的可读性。

数据案例

假设我们有以下user_balance表数据:

user_idop_timebalance
12023-04-01100
12023-05-01NULL
12023-06-01150
22023-04-01200
22023-05-01250
22023-06-01NULL

查询结果

执行上述查询后,我们将得到以下结果:

user_idop_timebalance
12023-06-01150
22023-06-01NULL

1 2023-06-01 150
2 2023-06-01 225

结果解释

对于user_id为1的用户,在2023-06-01,余额值为150,因为该日期的balance不为空。
对于user_id为2的用户,在2023-06-01,余额值为225,这是因为该日期的balance为空,因此使用前两天的滑动平均值来填补(即(200 + 250)/2 = 225)。

总结

通过这个示例,我们展示了如何使用SQL窗口函数来计算滑动平均,并处理缺失值。窗口函数提供了一种灵活且强大的方式来进行各种复杂的数据计算,特别是在处理时间序列数据时非常有用。希望这个案例能帮助你更好地理解和应用SQL窗口函数来解决实际问题。

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

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

相关文章

【JavaEE】加法计算器与用户登录实战演练

目录 综合练习加法计算器1. 准备工作2. 约定前后端交互接口3. 服务器代码 用户登录1. 准备工作2. 约定前后端交互接口3. 服务器代码4. 调整前端页面代码 综合练习 理解前后端交互过程接⼝传参, 数据返回, 以及⻚⾯展⽰ 加法计算器 需求: 输⼊两个整数, 点击"点击相加&q…

56. UE5 RPG 给敌人添加AI实现跟随玩家

在这一篇里,我们要实现一下敌人的AI,敌人也需要一系列的行为,比如朝向英雄攻击,移动,在满足条件时施放技能。这些敌人的行为可以通过使用UE的内置的AI系统去实现。 在UE里,只要是基于Character类创建的蓝图…

安卓绕过限制直接使用Android/data无需授权,支持安卓14(部分)

大家都知道,安卓每次更新都会给权限划分的更细、收的更紧。   早在安卓11的时候还可以直接通过授权Android/data来实现操作其他软件的目录,没有之前安卓11授权的图了,反正都长一个样,就直接贴新图了。   后面到了安卓12~13的…

AWS安全性身份和合规性之IAM Identity Center(AWS Single Sign-On)

AWS IAM Identity Center,又称为AWS Single Sign-On(SSO),是一项AWS托管的身份验证服务,用于集中管理多个AWS账户和SaaS应用程序的用户身份验证和授权。 单点登录(SSO)是一种身份验证解决方案&…

SQL Server 基础学习笔记

## SQL Server 基础学习笔记 ### 1. SQL Server 概述 SQL Server 是 Microsoft 开发的关系数据库管理系统(RDBMS)。它支持 SQL 语言,并提供了数据存储、查询、更新和管理等功能。 ### 2. 安装与配置 - **下载与安装**:从 Micros…

C/C++常用错误 or 规范注意

目录 前言1、是否可以强转 前言 之前做过关于python报错集(未来如果出现一些有意义的错误还是会继续更新的),今天记录一下C/C的一些常见错误(可能其实不算error,只是根据规范,尽量提升代码质量&#xff09…

信息系统项目管理师0128:输出(8项目整合管理—8.6管理项目知识—8.6.3输出)

点击查看专栏目录 文章目录 8.6.3 输出 8.6.3 输出 经验教训登记册 经验教训登记册可以包含执行情况的类别和详细的描述,还可包括与执行情况相关的影响、建议和行动方案。经验教训登记册可以记录遇到的挑战、问题、意识到的风险和机会以及其他适用的内容。经验教训…

(delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)

13.1 全局数据、栈和堆** ​ 任何平台上的任何 Object Pascal 应用程序所使用的内存可以分为两个部分:代码和数据。就代码部分而言,程序可执行文件的指令部分、资源(如位图和窗体描述)以及程序使用的库都加载到其内存空间中。这些…

TypeScript 学习笔记(三):模块系统与命名空间

1. 引言 在前两篇学习笔记中,我们介绍了 TypeScript 的基础知识和高级类型系统。本篇将重点讲解 TypeScript 的模块系统与命名空间,帮助你理解如何组织代码、管理依赖以及与 JavaScript 互操作。 2. 模块系统 TypeScript 支持两种模块系统&#xff1a…

Debezium+Kafka:Oracle 11g 数据实时同步至 DolphinDB 解决方案

随着越来越多用户使用 DolphinDB,各式各样的应用场景对 DolphinDB 的数据接入提出了不同的要求。部分用户需要将 Oracle 11g 的数据实时同步到 DolphinDB 中来,以满足在 DolphinDB 中实时使用数据的需求。本篇教程将介绍使用 Debezium 来实时捕获和发布 …

npm介绍、常用命令详解以及什么是全局目录

目录 npm介绍、常用命令详解以及什么是全局目录一、介绍npm的主要功能npm仓库npm的配置npm的版本控制 二、命令1. npm init: 初始化一个新的Node.js项目&#xff0c;创建package.json文件。package.json是一个描述项目信息和依赖关系的文件。2. npm install <package_name&g…

LeetCode算法题:42. 接雨水(Java)

题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3…

基于vue3速学angular

因为工作原因&#xff0c;需要接手新的项目&#xff0c;新的项目是angular框架的&#xff0c;自学下和vue3的区别&#xff0c;写篇博客记录下&#xff1a; 参考&#xff1a;https://zhuanlan.zhihu.com/p/546843290?utm_id0 1.结构上&#xff1a; vue3:一个vue文件&#xff…

python:pycharm虚拟解释器报错环境位置目录为空

目录 解释器分控制台解释器 和 pycharm解释器 控制台解释器切换&#xff1a; pycharm解释器 解释器分控制台解释器 和 pycharm解释器 控制台解释器切换&#xff1a; 切换到解释器下 激活解释器 查看解释器 where python 激活成功 这时在控制台使用python xxx.py 可以…

卷积神经网络和误差反向传播如何一起工作

用更简单的方式来理解卷积神经网络&#xff08;CNN&#xff09;和误差反向传播法&#xff08;一种梯度下降的应用方式&#xff09;是如何一起工作的&#xff0c;这次我们用一个找宝藏的游戏来比喻&#xff1a; 游戏背景&#xff1a;寻宝图的秘密 想象你有一张藏宝图&#xff…

​​​【收录 Hello 算法】10.1 二分查找

目录 10.1 二分查找 10.1.1 区间表示方法 10.1.2 优点与局限性 10.1 二分查找 二分查找&#xff08;binary search&#xff09;是一种基于分治策略的高效搜索算法。它利用数据的有序性&#xff0c;每轮缩小一半搜索范围&#xff0c;直至找到目标元素或搜索区间为空…

C++中的类型转换

文章目录 C中的四种类型转换static_castreinterpret_castconst_castdynamic_cast RTTI C中的四种类型转换 C语言中已经存在类型转换了&#xff0c;为什么C还要提出自己风格的类型转换&#xff1f; C风格的转换格式很简单&#xff0c;但是有不少缺点的&#xff1a; 转换的可视…

​​​【收录 Hello 算法】第 10 章 搜索

目录 第 10 章 搜索 本章内容 第 10 章 搜索 搜索是一场未知的冒险&#xff0c;我们或许需要走遍神秘空间的每个角落&#xff0c;又或许可以快速锁定目标。 在这场寻觅之旅中&#xff0c;每一次探索都可能得到一个未曾料想的答案。 本章内容 10.1 二分查找10.2 二…

【如何检查 ONNX 模型是否正确?】onnx.checker.check_model 用法详解

以下是对 onnx.checker.check_model 函数文档的翻译&#xff1a; onnx.checker.check_model 检查模型的一致性&#xff0c;即模型在结构、格式和配置方面的正确性和完整性。 如果模型的 ir_version 设置不正确或高于检查器的 ir_version&#xff0c;或者模型在 metadata_pro…

Java序列化解密:技巧、陷阱与最佳实践

1. 概述Java序列化的概念与应用场景 1.1 序列化简介 在Java中&#xff0c;序列化机制允许我们将一个对象状态转换为一串字节序列&#xff0c;并可在稍后再将这串字节序列恢复为对象。这一特性极大地方便了对象的持久化处理与网络传输。 1.2 为何需要序列化 序列化主要用于两…