面向集合的思维编写SQL(2-移动累积值)

上一篇初步的介绍了一下面向集合思维编写SQL实现开窗函数的功能;

在这里也稍微介绍一下另外一种编写SQL的思维—面向过程,例如Oracle的 PL/SQL,作为一种过程化的语言, 以赋值、条件分支、循环等作为基本处理单元,并将系统整体分割成很多这样的单元的思维方式,在我看来,这更偏向于开发工作者。

确实Oracle和MSSQL这两种付费的数据库,有大量的高级函数去简化数据工作,这二者也广泛应用于商业智能领域。那么离开这些付费的产品工具,我们仅依靠着SQL和关系型数据库的原理又能在数据的世界中走多远呢?

1.场景与需求

我们有如下的一张表,date字段记录了交易日期,amt字段记录了交易金额,如下图:

现在我们要计算一个移动累计值,即计算当前行与其前面两行,一共是三行的和,如下图:

2.SQL实现:

若使用Oracle或者MSSQL,我们使用开窗函数可以很容易的实现:

那么摆脱工具的束缚,我们使用SQL进行如下的尝试:

结果如下:

3.SQL解读:

层层括号嵌套下,A3.date作为核心和代码的起始点,进行逐行的偏移,且始终在[A2.date,A3.date]内进行移动,并控制参与求和的记录集合始终在三条以内。

这里留下一个小问题,如果累积不满三行不做累加计算,也就是第一行记录与第二行记录不产生累加,如下图:

那么如何编写SQL呢?

/*原创,转载请联系!*/