从 MySQL 怎么按连续等值分组?

关键词导读:MySQL 连续等值 分组

这种分组的依据是比较上一行字段值,发生变化时产生新组。SQL 仅支持等值分组,要想实现这种有序分组就得经过几次数据变换,变换成等值分组。以支持窗口函数的新版 MySQL 为例,大概经过这么三步:

1、得出变化标志字段 flag。通过窗口函数 lag 得到上一行的字段值,发生变化 flag=1,否则为 0;

2、累加 flag 字段得到 acc 字段。从第一行累加到当前行,还是得用窗口函数实现:sum(flag)…BETWEEN ROWS UNBOUNDED AND CURRENT ROW;

3、按 acc 字段进行常规等值分组即可。

早期没有窗口函数的 MySQL,理论上也能实现,更复杂,就不细说了。

 

这类有序分组如果用 SPL 语言就很简单,用 group 操作的 @o 选项,一句就搞定连续等值分组了:

=A.group@o(f)

完成分组动作后,后续针对分组子集做任意的计算都方便:

=A.group@o(f).max(~.len()) 得到最大组的行数;

=A.group@o(f).(~.new(f,avg(f2))).conj() 得到每组 f2 的平均值;

=A.group@o(f).(~.sort@z(f2).m(to(3))).conj() 取出每组 f2 最大的三行;

 

除了连续等值分组,还有更通用的有序条件分组,比如与上一行的差值大于 10 时,产生新组:

=A.group@i(f>~[-1].f+10)

还有按照序号分组,嵌套分组等多种 SQL 难实现的分组方式,详情参考《分组子集》

 

SPL语句不能在数据库里直接执行,可以通过下面这样的语句从数据库、excel、文本里获得原始数据:
>T1=connect(”mysqlDB”).query(“select * from t”)

>T2=file(“d:/t.xlsx”).xlsimport()
>T3=file(“d:/t.csv”).import(;,",")

SPL能很方便地嵌入到JAVA应用,可参考《Java 如何调用 SPL 脚本》

具体使用方法可参考 《如何使用集算器》


以下是广告时间

对润乾产品感兴趣的小伙伴,一定要知道软件还能这样卖哟性价比还不过瘾? 欢迎加入好多乾计划。
这里可以低价购买软件产品,让已经亲民的价格更加便宜!
这里可以销售产品获取佣金,赚满钱包成为土豪不再是梦!
这里还可以推荐分享抢红包,每次都是好几块钱的巨款哟!
来吧,现在就加入,拿起手机扫码,开始乾包之旅



嗯,还不太了解好多乾?
猛戳这里
玩转好多乾