sql统计最大连续增加条数

news/2025/2/23 5:47:09/文章来源:https://www.cnblogs.com/fake6s/p/18726267

趋势特征是业务人员比较青睐的特征,其中涉及到连续变化期数,例如连续增大、减少期数等。这里写一下可以实现的思路。

1.使用变量

这个方法在我常用的sql平台中只有mysql支持。pgsql和hive无法实现。
在查询里声明select @var:=0,通过逻辑语句将起始位置置1,连续行处递增,和结束位置置0。得到连续变化的次数。

2.增长序列字符串化,统计子串长度

此方法在支持行列转换语法的数据库中都能实现。核心思想是构建增长的序列,然后拆分,统计最长串的长度。
大致的步骤有:
1.使用开窗函数判断每一行是否是增长,标记1和0,作为tag列
2.把tag列转压缩转换成行内字段,例如10011101101
3.使用正则切分,从0处切分,得到1,111,11,1,类似4个元素的数组的数据类型。
4.将数组再展成行,统计每个元素字符串的长度。取max(长度)即可。

该方法涉及到行列转换,步骤也算很多,在大数据量下效率预计比较低,代码也不算易读。这里给一个hive例子:
image

3.使用开窗函数

返璞归真的做法,这个方法的适用性、可读性、性能、扩展性都为最佳。只是要想明白两个事情。
1.构建一个辅助的排序列,用期数减去排序列得到连续段。
2.如何使用开窗函数构建辅助排序列。
举个例子:

金额 是否增长 辅助排序
1 3
2 2 0
3 4 1 1 2
4 6 1 2 2
5 8 1 3 2
6 1 0
7 2 1 4 3

假如我只有“期”和“金额”两列,现在需要求金额连续增长的期数。
第一步:使用开窗函数lag,判断是否增长,构建是否增长列。
第二步:使用开窗函数,要求对是否增长列为1的期进行排序。构建辅助排序
第三步:使用列的数值减去辅助排序列的数值,得到列。
第四步:求字段中相同值最大的数量。

其中第二步是操作难点,第三步是个思路上的难点。
如何实现第二步对给定条件的行进行row_number排序?操作方法如下:

case when 是否增长 = 1 then row_number()over(partition by case when 是否增长 = 1 then 1 else 0 end order by 期)
end

这里的原理是,通过在partition by 后使用case when end语句构建出是否符合增长条件的组,然后在两个组中分别进行期数的排序。再在外面使用case when end语句选择符合增长条件的组内排序。

总结

三种方法,推荐方法三。优势有:

  • 适用性:对比方法1,支持开窗函数的数据库都可以使用
  • 扩展性:对比方法2,可以对一张表中的多个字段求取连续变化期数,只需要构建各自的辅助列。可以在一段sql语句中完成
  • 性能和可读性:对比方法2,不需要进行行列转换,只需通过开窗逻辑运算构建辅助列即可完成。没有复杂的sql嵌套结构,因此可读性佳。

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

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

相关文章

安川机器人维修SGMAV-A5ANA-YR13伺服电机

在工业自动化领域,安川机器人扮演着至关重要的角色。而其中的SGMAV - A5ANA - YR13伺服电机一旦出现故障,将会影响整个安川机器人的正常运作。 安川机器人SGMAV - A5ANA - YR13伺服电机常见故障一、电气故障线路连接问题在维修中,常常会发现线路松动或者短路的情况。这可能是…

Azure AI Foundry实验室

微软Azure AI Foundry实验室(https://ai.azure.com/labs)旨在通过实验性技术,加速AI创新应用,推动从概念探索到实际解决方案的转化。其聚焦领域包括游戏开发、极端天气预测、药物发现、材料科学、自动化交互等,并强调社区协作以促进技术落地。原文核心实验项目与技术1.Muse定…

ABB机器人维修DSQC1000主机故障

在工业生产领域,ABB机器人发挥着至关重要的作用。然而,像DSQC1000主机这样的关键部件也可能会出现故障,需要进行维修。 一、ABB机器人DSQC1000主机故障的常见表现(1)通讯故障在ABB机器人系统中,DSQC1000主机如果出现通讯故障,可能导致机器人无法接收正确的指令。这时候,…

Svelte 最新中文文档教程(14)—— 特殊元素

前言 Svelte,一个非常“有趣”、用起来“很爽”,面向未来的前端框架。从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1:Svelte 以其独特的编译时优化机制著称,具有轻量级、高性能、易上手等特性,…

清华大学第四版:DeepSeek+DeepResearch:让科研像聊天一样简单!(附PDF免费下载)

还在为文献综述熬夜秃头?数据分析做到怀疑人生?清华大学与北航团队联合开发的DeepSeek+DeepResearch横空出世,彻底颠覆传统科研模式!这款AI工具让科研像聊天一样轻松,一键生成高质量报告,效率提升10倍!还在为文献综述熬夜秃头?数据分析做到怀疑人生?清华大学与北航团队…

2.Java基础

本章目标数据类型 变量和常量 运算符 数组 循环本章内容问题:任何编程语言都离不开数据的计算,那么在编程语言中能过什么来保存变化的计算的值,有哪些类型可以用于计算?这时我们就需要使用到:数据类型、变量、常量、运算符一、数据类型 java数据类型可分为两大类(基本数据…

不可不知的浏览器使用技巧

本文是《最全面的浏览器教程》第二篇,主要介绍浏览器的基本概念,基本技巧,以及相关设置。​ 本文是《最全面的浏览器教程》第二篇,主要介绍浏览器的基本概念,基本技巧,以及相关设置。 除此之外,还会介绍一些我平时遇到的问题和解决办法。 ‍ 浏览器是什么 简单来说,浏览…

codelldb-win32-x64.vsix 插件安装

vscode 安装 出++插件更新     nstalling platform package from https://github.com/vadimcn/codelldb/releases/download/v1.11.4/codelldb-win32-x64.vsix Error: Error: socket hang up https://github.com/vadimcn/codelldb/releases/vadimcn v1.11.4 e5aef55 Compar…

最全面的浏览器教程

这个教程能让你的浏览器更加好用、好玩。​ 这个教程能让你的浏览器更加好用、好玩。 ‍ 为什么写 在 日渐孤岛化的互联网上,浏览器的重要性在逐渐下降。但不可否认的是,它依然重要,是日常生活中常用软件之一。 我自己就是电脑端重度用户,浏览器是我用的最频繁的软件之一,…

Vision Transformer中的图像块嵌入详解:线性投影和二维卷积的数学原理与代码实现

Transformer 架构因其强大的通用性而备受瞩目,它能够处理文本、图像或任何类型的数据及其组合。其核心的“Attention”机制通过计算序列中每个 token 之间的自相似性,从而实现对各种类型数据的总结和生成。在 Vision Transformer 中,图像首先被分解为正方形图像块,然后将这…

10分钟搭建DeepSeek R1满血版个人知识库实例指导

本文通过一个完整实例(花茶大师),手把手教你搭建基于DeepSeek R1的个人知识库本文通过一个完整实例(花茶大师),手把手教你搭建基于DeepSeek R1的个人知识库 一. 搭建满血版DeepSeek R1 1、下载Cherry Studio,已下载请忽略 下载地址 2、登录/注册「硅基流动」,新用户会赠…

Vue2.0 运用PDFjs 直接运用pdfjs-dist加载pdf文件

首先pdfjs这部分有2种加载运用方式。 1、直接npm的形式。2、直接运用其构建好的文件。本文就直接讲述的第二种。pdfjs官网https://mozilla.github.io/pdf.js/getting_started/#download。(划重点,注意看viewer.html,viewer.mjs)文件解压之后直接放入项目中,随便哪个地方。在…