SQL进阶实战技巧:断点去重技术详解
目录
一、核心概念
二、典型应用场景
三、实现步骤与SQL示例
场景
目标
步骤
分析
结果
四、核心原理解释
1. 核心原理:相邻比较
2. 去重的本质
3. 与传统方法的对比
4 类别理解
五、如何应对复杂场景?
1. 多字段断点检测
2. 时间窗口断点
四、小结
一、核心概念
断点去重 是一种处理 连续重复数据 的技术,常用于时间序列或状态日志中。其核心目标是:
- 检测变化点(Gaps):标记值发生变化的边界点。
-
保留断点记录:将连续相同值的记录合并,只保留断点处的记录。
-
连续重复数据(如设备状态日志)的特点是:相邻记录的值可能长时间保持不变,仅在特定时间点发生突变。例如,设备状态从“正常”变为“故障”,再恢复为“正常”。
-
传统分组去重(如
ROW_NUMBER())的局限在于:它们基于固定分组字段(如user_id),但无法捕捉到连续重复区间内的动态变化。
二、典型应用场景
-
在物联网、日志分析等场景中,用户往往只关心状态变化的时刻(如设备何时故障、用户何时点击按钮),而非所有重复记录。
-
例如:设备连续上报多次“正常”状态,只有第一次“正常”和第一次“故障”的记录是真正有价值的信息。
设备状态监控
- 合并设备连续相同的运行状态记录。
用户行为分析
- 合并用户连续访问同一页面的时间段。
传感器数据清洗
- 合并温度/湿度等连续相同的采样值。
三、实现步骤与SQL示例
场景
传感器采集的温度数据中,存在连续重复的值,需仅在数值变化时保留记录(例如:温度从 25°C 变为 26°C 时记录一次)。
原始数据表 sensor_data:
| timestamp | temperature | |
|---|---|---|
| 2023-01-01 08:00:00 | 25 | |
| 2023-01-01 08:05:00 | 25 | ← 连续重复 |
| 2023-01-01 08:10:00 | 26 | ← 断点(值变化) |
| 2023-01-01 08:15:00 | 26 | ← 连续重复 |
目标
保留断点处的记录(即温度变化时的第一条)。
步骤
WITH marked_data AS (SELECT *,LAG(temperature) OVER (ORDER BY timestamp) AS prev_tempFROM sensor_data
)
SELECT timestamp, temperature
FROM marked_data
WHERE temperature != prev_temp OR prev_temp IS NULL; -- 第一条记录无条件保留
分析
-
LAG(temperature)获取前一行的温度值。 -
若当前温度与前一行的温度不同(或为第一条记录),则保留该行。
-
最终仅保留值变化的断点记录。
结果
| timestamp | temperature |
|---|---|
| 2023-01-01 08:00:00 | 25 |
| 2023-01-01 08:10:00 | 26 |
四、核心原理解释
1. 核心原理:相邻比较
-
LAG(status):获取当前行的前一条记录的status值。 -
status <> prev_status:如果当前行的状态与前一行不同,说明此处发生了状态变化,即断点。 -
prev_status IS NULL:保留第一条记录(因为它没有前一行,是初始状态)。
2. 去重的本质
-
通过筛选出所有断点记录(即状态变化的记录),隐式合并了连续的重复数据。
例如:
原始数据:OK → OK → Error → Error → OK
断点记录:OK(初始) → Error(变化) → OK(变化)
-
最终结果仅保留每个连续区间的起点,从而实现了去重。
3. 与传统方法的对比
| 方法 | 去重逻辑 | 适用场景 |
|---|---|---|
DISTINCT | 完全相同的行去重 | 静态重复数据(如全表去重) |
ROW_NUMBER() | 按固定分组保留首条/末条 | 分组内重复(如用户最新操作) |
LAG()+比较 | 动态检测相邻记录的变化点 | 连续重复数据(如状态日志) |
4 类别理解
想象你在阅读一篇长篇小说,书中连续多页描述同一个场景(例如“主角在森林中行走”)。如果你只想标记场景变化的页码(例如“主角进入城堡”),你会:
-
逐页比较当前页和前一页的内容。
-
当发现内容变化时,记录当前页码。
这正是 LAG() 函数的思维逻辑:通过局部比较,找到全局变化点。
五、如何应对复杂场景?
1. 多字段断点检测
-
如果断点由多个字段共同决定(如同时检测
status和temperature),只需扩展比较条件:WHERE status <> prev_status OR temperature <> prev_temperature
2. 时间窗口断点
-
如果需忽略短暂的状态抖动(如状态持续不足5分钟不视为断点),可结合时间差过滤:
LAG(timestamp) OVER (...) AS prev_timestamp, WHERE timestamp - prev_timestamp > INTERVAL '5 minutes'
四、小结
通过本文的解析,读者可以深入理解断点去重的核心逻辑,掌握其SQL实现方法
其核心思想是:通过局部差异检测全局变化。通过 LAG()获取上一字段状态值与当前行值进行比较,判断是否相等进行去重判断,核心思路如下:
-
检测变化:利用
LAG()比较相邻行差异。 -
保留断点记录:判断逻辑,current_value != lag_value
相关文章:
SQL进阶实战技巧:断点去重技术详解
目录 一、核心概念 二、典型应用场景 三、实现步骤与SQL示例 场景 目标 步骤 分析 结果 四、核心原理解释 1. 核心原理:相邻比较 2. 去重的本质 3. 与传统方法的对比 4 类别理解 五、如何应对复杂场景? 1. 多字段断点检测 2. 时间窗口断点 …...
深度学习之“向量范数和距离度量”
在深度学习中,范数和向量距离是两个不同的概念。向量范数是一种函数,用于将一个实数或复数向量映射为一个值。虽然范数通常用于度量向量之间的距离,但是同样也有其它的一些表示距离的方式。 范数距离 范数是具有“长度”概念的函数。在向量…...
基于Python的简单企业维修管理系统的设计与实现
以下是一个基于Python的简单企业维修管理系统的设计与实现,这里我们会使用Flask作为Web框架,SQLite作为数据库来存储相关信息。 1. 需求分析 企业维修管理系统主要功能包括: 维修工单的创建、查询、更新和删除。设备信息的管理。维修人员…...
javascript常用函数大全
javascript函数一共可分为五类: •常规函数 •数组函数 •日期函数 •数学函数 •字符串函数 1.常规函数 javascript常规函数包括以下9个函数: (1)alert函数:显示一个警告对话框,包括一个OK按钮。 (2)confirm函数:显…...
【Leetcode 每日一题】81. 搜索旋转排序数组 II
问题背景 已知存在一个按非降序排列的整数数组 n u m s nums nums,数组中的值不必互不相同。 在传递给函数之前, n u m s nums nums 在预先未知的某个下标 k ( 0 < k < n u m s . l e n g t h ) k\ (0 < k < nums.length) k (0<k<…...
< OS 有关 > Android 手机 SSH 客户端 app: connectBot
connectBot 开源且功能齐全的SSH客户端,界面简洁,支持证书密钥。 下载量超 500万 方便在 Android 手机上,连接 SSH 服务器,去运行命令。 Fail2ban 12小时内抓获的 IP ~ ~ ~ ~ rootjpn:~# sudo fail2ban-client status sshd Status for the jail: sshd …...
【算法设计与分析】实验7:复杂装载及0/1背包问题的回溯法设计与求解
目录 一、实验目的 二、实验环境 三、实验内容 四、核心代码 五、记录与处理 六、思考与总结 七、完整报告和成果文件提取链接 一、实验目的 针对复杂装载问题、及0/1背包问题开展分析、建模、评价,算法设计与优化,并进行编码实践。 理解复杂装载…...
仿真设计|基于51单片机的温湿度、一氧化碳、甲醛检测报警系统
目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现(protues8.7) 程序(Keil5) 全部内容 资料获取 具体实现功能 (1)温湿度传感器、CO传感器、甲醛传感器实时检测温湿度值、CO值和甲醛值进…...
使用vhd虚拟磁盘安装两个win10系统
使用vhd虚拟磁盘安装两个win10系统 前言vhd虚拟磁盘技术简介准备工具开始动手实践1.winX选择磁盘管理2.选择“操作”--“创建VHD”3.自定义一个位置,输入虚拟磁盘大小4.右键初始化磁盘5.选择GPT分区表格式6.右键新建简单卷7.给卷起个名字,用于区分8.打开…...
Python学习——函数参数详解
Python中的函数参数传递机制允许多种灵活的参数类型,可以根据需求灵活配置参数,这使得函数具有更强大的扩展性和适应性。以下是对各类参数类型的详细说明: 1. 定义函数的不同参数类型 1.1 位置参数 定义方式:def func(a, b2) 特…...
深入理解Spring事务管理
一、事务基础概念 1.1 什么是事务? 事务(Transaction)是数据库操作的最小工作单元,具有ACID四大特性: 原子性(Atomicity):事务中的操作要么全部成功,要么全部失败 一致…...
自制虚拟机(C/C++)(二、分析引导扇区,虚拟机读二进制文件img软盘)
先修复上一次的bug,添加新指令,并增加图形界面 #include <graphics.h> #include <conio.h> #include <windows.h> #include <commdlg.h> #include <iostream> #include <fstream> #include <sstream> #inclu…...
基于最近邻数据进行分类
人工智能例子汇总:AI常见的算法和例子-CSDN博客 完整代码: import torch import numpy as np from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score import matplotlib.pyplot as plt# 生成一个简单的数据集 (2个特征和2个分类…...
ASP.NET Core 启动并提供静态文件
ASP.NET Core 启动并提供静态文件 即是单个可执行文件,它既运行 API 项目,也托管 前端项目(通常是前端的发布文件)。 这种方式一般是通过将 前端项目 的发布文件(例如 HTML、CSS、JavaScript)放入 Web AP…...
【异步编程】CompletableFuture:异步任务的选择(执行最快的)执行
文章目录 一. applyToEither : 拿到第一个任务结束的结果二. runAfterEither :第一个任务完成后执行副作用三. acceptEither:消费第一个任务的结果四. 三种接口总结 对于两个异步任务,我们有时希望在其中一个任务完成时立即执行某些操作&…...
4 [危机13小时追踪一场GitHub投毒事件]
事件概要 自北京时间 2024.12.4 晚间6点起, GitHub 上不断出现“幽灵仓库”,仓库中没有任何代码,只有诱导性的病毒文件。当天,他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒,等待不…...
变量和常量
一.变量 1.标准声明 var 变量名 变量类型 变量声明行末不需要分号 2..批量声明 package main import "fmt" func main(){var(a string b int c boold float32)}3.变量的初始化 var a int 10 var b float321.1 4.类型推导 var name"tom" var age18 fmt.Pr…...
大模型概述(方便不懂技术的人入门)
1 大模型的价值 LLM模型对人类的作用,就是一个百科全书级的助手。有多么地百科全书,则用参数的量来描述, 一般地,大模型的参数越多,则该模型越好。例如,GPT-3有1750亿个参数,GPT-4可能有超过1万…...
流浪 Linux: 外置 USB SSD 安装 ArchLinux
注: ArchLinux 系统为滚动更新, 变化很快, 所以本文中的安装方法可能很快就过时了, 仅供参考. 实际安装时建议去阅读官方文档. 最近, 突然 (也没有那么突然) 有了一大堆 PC: 4 个笔记本, 2 个台式主机 (M-ATX 主板), 1 个小主机 (迷你主机). 嗯, 多到用不过来. 但是, 窝又不能…...
Hot100之子串
560和为K的子数组 题目 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列 思路解析 ps:我们的presum【0】就是0,如果没有这个0的话我们的第一个元素就无法减去上…...
网络工程师 (11)软件生命周期与开发模型
一、软件生命周期 前言 软件生命周期,也称为软件开发周期或软件开发生命周期,是指从软件项目的启动到软件不再被使用为止的整个期间。这个过程可以细分为多个阶段,每个阶段都有其特定的目标、任务和产出物。 1. 问题定义与需求分析 问题定义…...
(三)QT——信号与槽机制——计数器程序
目录 前言 信号(Signal)与槽(Slot)的定义 一、系统自带的信号和槽 二、自定义信号和槽 三、信号和槽的扩展 四、Lambda 表达式 总结 前言 信号与槽机制是 Qt 中的一种重要的通信机制,用于不同对象之间的事件响…...
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(基础图形库实现)
目录 基础图形库的抽象 抽象图形 抽象点 设计我们的抽象 实现我们的抽象 测试 抽象线 设计我们的抽象 实现我们的抽象 绘制垂直的和水平的线 使用Bresenham算法完成任意斜率的绘制 绘制三角形和矩形 矩形 三角形 实现 绘制圆,圆弧和椭圆 继续我们的…...
hot100_21. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 示例 2: 输入:l1 [], l2 [] 输出:[…...
安全防护前置
就业概述 网络安全工程师/安全运维工程师/安全工程师 安全架构师/安全专员/研究院(数学要好) 厂商工程师(售前/售后) 系统集成工程师(所有计算机知识都要会一点) 学习目标 前言 网络安全事件 蠕虫病毒--&…...
01-六自由度串联机械臂(ABB)位置分析
ABB工业机器人(IRB2600)如下图所示(d1444.8mm,a1150mm,a2700mm,a3115mm,d4795mm,d685mm),利用改进DH法建模,坐标系如下所示: 利用改进…...
JVM运行时数据区域-附面试题
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域 有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是 依赖用户线程的启动和结束而建立和销毁。 1. 程序计…...
Java线程池与Future_优化并发任务执行
1. 引言 1.1 并发编程的重要性 并发编程是现代软件开发中的关键部分,特别是在处理高并发、大数据和分布式系统时。通过并发编程,可以充分利用多核处理器的计算能力,提高系统的吞吐量和响应速度。 1.2 线程池与Future的作用 线程池:提供了对线程资源的有效管理和复用,减…...
HTML(快速入门)
欢迎大家来到我的博客~欢迎大家对我的博客提出指导,有错误的地方会改进的哦~点击这里了解更多内容 目录 一、前言二、HTML基础2.1 什么是HTML?2.2 认识HTML标签2.2.1 HTML标签当中的基本结构2.2.2 标签层次结构 2.3 HTML常见标签2.3.1 标题标签2.3.2 段落标签2.3.3…...
《苍穹外卖》项目学习记录-Day10订单状态定时处理
利用Cron表达式生成器生成Cron表达式 1.处理超时订单 查询订单表把超时的订单查询出来,也就是订单的状态为待付款,下单的时间已经超过了15分钟。 //select * from orders where status ? and order_time < (当前时间 - 15分钟) 遍历集合把数据库…...
