使用 SQL Over Statement 滚动求和

Using SQL Over Statement with rolling sum

我正在尝试跟踪使用前一年的数据价值计算的滚动总和。

目前我有这个作为我的 SQL:

SELECT lngTIMEID as Id,
        lngEMPID as EmployeeId,
        dtmdateapp AS [Date], 
        stroccur AS [Value],
        (SELECT Sum(stroccur) 
         FROM   [Attendance].[dbo].timeuse a 
         WHERE  a.dtmdateapp between DateAdd(d, -366, d.dtmdateapp) 
                AND d.dtmDATEAPP
                AND a.lngempid = d.lngempid) AS Total
 FROM   [Attendance].[dbo].[timeuse] d
         WHERE lngEMPID =  1844140 AND absence = 'Unscheduled' AND lngRID IN (1,2,3,4,5,7,8,9,10,11,12,13,14)

返回的结果如下:

+--------+------------+-----------+-------+-------+
|   Id   | EmployeeId |   Date    | Value | Total |
+--------+------------+-----------+-------+-------+
| 330435 |    1844140 | 4/17/2017 |  0.25 |  0.25 |
| 330849 |    1844140 | 4/19/2017 |  0.25 |   0.5 |
| 331108 |    1844140 | 4/20/2017 |  0.25 |  0.75 |
| 331641 |    1844140 | 4/24/2017 |  0.25 |     1 |
| 331736 |    1844140 | 4/25/2017 |  0.25 |  1.25 |
| 333761 |    1844140 | 5/5/2017  |  0.25 |   1.5 |
| 336080 |    1844140 | 5/17/2017 |     1 |   2.5 |
| 349752 |    1844140 | 8/2/2017  |  0.25 |     3 | <--- this should be 2.75
| 350994 |    1844140 | 8/9/2017  |     1 |     4 |
| 351426 |    1844140 | 8/11/2017 |  0.25 |  4.25 |
| 352132 |    1844140 | 8/15/2017 |   0.5 |  4.75 |
| 354236 |    1844140 | 8/25/2017 |  0.25 |     5 |
| 355580 |    1844140 | 8/29/2017 |  0.25 |  5.25 |
| 355650 |    1844140 | 9/5/2017  |  0.25 |   5.5 |
+--------+------------+-----------+-------+-------+

这个想法是它会遍历所有事件并总结当前日期一年内发生的所有先前事件。

在我当前的代码中,总命中数为 3 的计算存在问题。

我想使用 SQL Over 语句,因为它计算正确,但我不确定如何在滚动的 1 年时间范围内使用它。这是我用的:

SELECT lngTIMEID as Id,
        lngEMPID as EmployeeId,
        dtmdateapp AS [Date], 
        stroccur AS [Value],
        sum(strOCCUR) OVER(ORDER BY dtmdateapp ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as [Total]
 FROM   [Attendance].[dbo].[timeuse] d
         WHERE lngEMPID =  1844140 AND absence = 'Unscheduled' AND lngRID IN (1,2,3,4,5,7,8,9,10,11,12,13,14)

并给出了正确的结果,因为这些数据都发生在同一年,但它不适用于滚动的 1 年时间范围:

+--------+------------+-----------+-------+-------+
|   Id   | EmployeeId |   Date    | Value | Total |
+--------+------------+-----------+-------+-------+
| 330435 |    1844140 | 4/17/2017 |  0.25 |  0.25 |
| 330849 |    1844140 | 4/19/2017 |  0.25 |   0.5 |
| 331108 |    1844140 | 4/20/2017 |  0.25 |  0.75 |
| 331641 |    1844140 | 4/24/2017 |  0.25 |     1 |
| 331736 |    1844140 | 4/25/2017 |  0.25 |  1.25 |
| 333761 |    1844140 | 5/5/2017  |  0.25 |   1.5 |
| 336080 |    1844140 | 5/17/2017 |     1 |   2.5 |
| 349752 |    1844140 | 8/2/2017  |  0.25 |  2.75 |
| 350994 |    1844140 | 8/9/2017  |     1 |  3.75 |
| 351426 |    1844140 | 8/11/2017 |  0.25 |     4 |
| 352132 |    1844140 | 8/15/2017 |   0.5 |   4.5 |
| 354236 |    1844140 | 8/25/2017 |  0.25 |  4.75 |
| 355580 |    1844140 | 8/29/2017 |  0.25 |     5 |
| 355650 |    1844140 | 9/5/2017  |  0.25 |  5.25 |
+--------+------------+-----------+-------+-------+

如何将 1 年的滚动时间范围添加到 MS SQL 的 Over 语句中?

正如 James 所提到的,您的原始子查询应该可以工作。我在我的环境中对其进行了测试,结果 return 正确。

WITH tu AS ( 
   SELECT *
   FROM   [Attendance].[dbo].[timeuse] d
   WHERE lngEMPID =  1844140 AND absence = 'Unscheduled' AND lngRID IN (1,2,3,4,5,7,8,9,10,11,12,13,14)
)
SELECT lngTIMEID as Id,
        lngEMPID as EmployeeId,
        dtmdateapp AS [Date], 
        stroccur AS [Value],
        (SELECT Sum(stroccur) 
         FROM   tu a 
         WHERE  a.dtmdateapp between DateAdd(d, -366, d.dtmdateapp) 
                AND d.dtmDATEAPP
                AND a.lngempid = d.lngempid) AS Total
FROM   tu d