此类问题还可以延伸到类似进销存的批次计算中,这也要关注其他历史记录来决定当前某条记录的状态。
sql语句无法简单实现mdx语句的类似功能,必须得用交叉表关联来对比。这里我们用clr函数来实现mdx语句的类似语法。在select的时候把得到过的做个缓存就可以了。效率应该可以提高不少。
clr的代码如下,编译为testfun.dll,复制到sql服务器的文件目录下。
——————————————————————————–
——————————————————————————–
部署和生成自定义函数,其中考虑到并发,我们还是需要一个并发键来表达当前查询
——————————————————————————–
——————————————————————————–
这样我们就可以使用了,测试脚本如下, xfn_getprevmembervalue就是获取上月价格的函数。
——————————————————————————–
— 建立测试环境
— 测试语句
— 结果
/*
区域 trademonth tradeprice lastmonthprice 环比
—- ———- ———————- ———————- ———–
闵行 2007-03 8796.67 null null
闵行 2007-04 9267.19 8796.67 5.35%
闵行 2007-05 9335.26 9267.19 0.73%
浦东 2007-01 8976.73 null null
浦东 2007-02 12568.05 8976.73 40.01%
浦东 2007-03 8023.98 12568 -36.16%
浦东 2007-04 18337.23 8023.98 128.53%
普陀 2007-01 11549.02 null null
普陀 2007-02 13496.24 11549 16.86%
普陀 2007-03 7834 13496.2 -41.95%
*/
——————————————————————————–
这个函数写的还是比较粗糙,如果进一步改进还可以详细定义如何获取上一个维度的方法。这里只是根据查询顺序来做缓存。感兴趣的朋友可以完善一下。