前言:
最近使用帆软的报表系统搭建品质的IQC趋势分析demo给相关领导汇报争取一炮打响,哪知道连续打了两个哑炮。一个就是MR里面的移动极差的计算,一个是使用帆软tab块然后增加报表块,再在报表块里面增加图表进行趋势分析,如果你有兴趣的话,请继续往下看。本次心得分析主要是整理网上没有系统总结的开窗函数的使用和移动求和、移动极差、移动平均的运用。然后就是帆软tab块BUG的处理。
解题思路
移动极差的计算
Q:如图所示,移动极差=ABS(计算列的第一个值-第二个值),但第一个计算结果是空值
A:假如将这些数据存储值数据库的表t1中,数据列为Ni,在SQL里面怎么写呢,第一种会想到使用自连接的形式,分两断重新关联使用,利用第一段行号=第二段行号-1关联得错位的数据,可实现该需求,但在实际应用发现,该种方法效率比较低而且占用服务器较多的资源。
对于一个IT人员来说不是只实现了客户需求就会满足,因此,放弃了这套思路,去网上查找开窗函数的相关用法,因此开展了自己的新大陆,发现类似直接使用over函数和 rows between n preceding and n following就可以得到移动累计数值,求出移动累计后,求移动平均就很简单,除以对应天数或者使用AVG函数即可,效果如图所示:
SELECT [salesdate] ,[Region] ,sale ,sum(sale)over(order by salesdate,region rows BETWEEN 2 preceding AND CURRENT ROW)-- FROM [Rollingtest] t1 where salesdate <'20210910'
但是所有的开窗函数好像不支持“移动相减”的算法。因此此时我又换了一个思路,是不是有个函数可以直接获取上下行相邻的数据呢,功夫不负有心人找到了lead和lag函数,解决了这个问题
最终的效果图如图所示:
参考代码如下所示:
Select t1.*, case when ROW_NUMBER() OVER ( ORDER BY SUBSTRING(CONVERT(varchar(100),更新时间,23),1,10) )=1 then 0 else ABS(Mn-LAG(Mn, 1, 0) OVER (ORDER BY SUBSTRING(CONVERT(varchar(100),更新时间,23),1,10))) end jc from t1--通过ROW_NUMBER() OVER ()开窗函数排序实现了第一行为空的处理,使用lag函数实现了错位取值的功能
帆软bug展示
Q:tab块下图表显示不全
A:通过与帆软客服一下午的调试,刚开始怀疑是插件的问题,后来怀疑是浏览器缩放的问题,后面与其他环境对比发现是tab块下,报表块自适应的问题,具体操作如图所示。
心得体会
理清思路,学无止境