sql统计最大连续增长条数

去皮卡多  金牌会员 | 2025-2-20 15:25:36 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 909|帖子 909|积分 2727

趋势特性是业务人员比较青睐的特性,其中涉及到连续变化期数,例如连续增大、淘汰期数等。这里写一下可以实现的思路。
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例子:

3.使用开窗函数

返璞归真的做法,这个方法的实用性、可读性、性能、扩展性都为最佳。只是要想明白两个事情。
1.构建一个辅助的排序列,用期数减去排序列得到连续段。
2.如何使用开窗函数构建辅助排序列。
举个例子:
期金额是否增长辅助排序段1322034112461225813261072143假如我只有“期”和“金额”两列,现在需要求金额连续增长的期数。
第一步:使用开窗函数lag,判断是否增长,构建是否增长列。
第二步:使用开窗函数,要求对是否增长列为1的期举行排序。构建辅助排序列
第三步:使用期列的数值减去辅助排序列的数值,得到段列。
第四步:求段字段中雷同值最大的数量。
其中第二步是操纵难点,第三步是个思路上的难点。
如何实现第二步对给定条件的行举行row_number排序?操纵方法如下:
  1. case when 是否增长 = 1 then
  2.         row_number()over(partition by
  3.                                 case when 是否增长 = 1 then 1 else 0 end
  4.                         order by 期)
  5. end
复制代码
这里的原理是,通过在partition by 后使用case when end语句构建出是否符合增长条件的组,然后在两个组中分别举行期数的排序。再在外面使用case when end语句选择符合增长条件的组内排序。
总结

三种方法,保举方法三。上风有:

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

去皮卡多

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表