SQL 运行 过去 3 个月的总计(按日期和 ID)

SQL Running total previous 3 months by date and id

这是我正在使用的 table q3 的简化版:

      Partno EndOfMonth AA AS EA ES
        a    31.5.2017   5  1  0  1
        b    31.5.2017   3  1  0  1
        c    31.5.2017   2  2  0  1
        a    31.6.2017   1  2  2  2
        b    31.6.2017   1  0  1  2
        c    31.6.2017   2  3  1  4
        a    31.7.2017   4  3  2  0
        b    31.7.2017   3  0  6  0
        c    31.7.2017   4  1  0  0

我需要对 Partno 中每个部分的最后四列中的数字求和,以便总和代表 运行 最后三个月在 EndOfMonth 列中每个日期的总数。

我要找的结果是:

      Partno EndOfMonth AA AS EA ES
        a    31.5.2017   5  1  0  1
        b    31.5.2017   3  1  0  1
        c    31.5.2017   2  2  0  1
        a    31.6.2017   6  3  2  3
        b    31.6.2017   6  1  1  3
        c    31.6.2017   4  5  1  5
        a    31.7.2017   10 6  4  3
        b    31.7.2017   7  1  7  3
        c    31.7.2017   8  6  1  5

例如对于 2017 年 7 月 31 日的 partno A,'AA' 列的最后一个月的总和是 4+1+5=10.

我对 SQL 还是个新手,对此我深信不疑。我已经尝试了类似下面的方法来获得一个简单的滚动总数(甚至没有指定最近 3 个月的总和范围)。另外,我不确定数据库是否支持下面代码中的所有功能,因为它给我错误 "Incorrect Syntax near the keyword 'OVER'"

  SELECT
    Partno,
    EndofMonth,
    SUM(q3.AA) OVER (PARTITION BY q3.Partno ORDER BY EndofMonth ROWS UNBOUNDED PRECEDING) as 'AA'
FROM q3

无论如何,我们将不胜感激!

谢谢

编辑:

感谢 Benjamin 以及此 post 的一点帮助:https://dba.stackexchange.com/questions/114403/date-range-rolling-sum-using-window-functions 我找到了解决方案:

SELECT a.Partno, a.EndofMonth, SUM(b.AA) as 'AA', SUM(b.AS) as 'AS',... 
FROM q3 a, q3 b
WHERE a.Partno = b.Partno AND a.endOfMonth >= b.endOfMonth
    AND b.endOfMonth >= DATEADD(month,-2,a.endOfMonth)
GROUP BY a.Partno, a.endOfMonth

类似这样的方法可能有效:

SELECT a.Partno, a.EndofMonth, SUM(b.AA) as AA
FROM q3 a, q3 b
WHERE a.Partno = b.Partno
    AND DATEDIFF(month, b.endOfMonth, a.endOfMonth) < 4
GROUP BY a.Partno, b.Partno

这里假设 endOfMonth 是日期时间格式,否则您将不得不使用 convert()。请注意,您可能必须根据您使用的实现替换 DATEDIFF()。

我还没有测试过这个,所以我可能离题太远了。我和 SQL 一起工作已经有一段时间了。希望你可以通过稍微弄乱它来让它工作,如果没有,那么它可能会激励你写出更好的东西。让我知道进展如何!