2016-01-13 23 views
0

我有一個需要添加到實際的變化的預測。從一個點運行總和

例子:

 
Date Group Count ActForc 
Nov-15 GrpA 10 A 
Dec-15 GrpA 12 A 
Jan-16 GrpA -1 F 
Feb-16 GrpA 2  F 

我想看到的是:

 
Date Group Count 
Nov-15 GrpA 10 
Dec-15 GrpA 12 
Jan-16 GrpA 11 
Feb-16 GrpA 13 

但我已經看到了計數/運行總和的查詢假設我想要的部分是分開的,併爲我提供了爲每個部分創建總和的方法,但本質上,我想爲第二部分的總數和第一部分的最終值進行種子處理,並從該點開始繼續,而不會干擾第二部分的值

+0

ActForc有什麼用? –

+0

來區分實際值和預測 – SeanC

回答

1

如果你的預測總是在日期範圍的結束,也可以通過內部相互幾個窗口功能做到這一點。下面是一個在字段上計算的運行總數,該字段檢查下一行是否爲'F',然後是否需要計數,否則爲0.如果在下一行是F時代替計數,它將包含您想要的數字。

select 
    [date], 
    [group], 
    case when isnull(lead(ActForc) over (order by Date asc),ActForc) = 'F' then 
    sum(Count2) over (order by Date asc) else [Count] end, 
    [count], 
    ActForc 
from (
    select 
    [date], 
    [group], 
    case when isnull(lead(ActForc) over (order by Date asc),ActForc) = 'F' then [Count] else 0 end as Count2, 
    [count], 
    ActForc 
    from 
    table1 
) X 

這應該比任何遞歸CTE /相關子查詢執行得更好,因爲數據不會被多次讀取。如果你有更多的組,分組窗口函數應該修復這個問題。

SQL Fiddle中的示例有幾個月。

+0

從來沒有想過我的看法,看起來像格式就是這樣。 –

1

試用recursive cte。

首先創建一個子查詢以具有ROW_ID

然後創建基本情形與RN = 1

最後遞歸計算每個下一級。

SQL Fiddle Demo

WITH addID as (
    SELECT [Date], [Group], [Count], [ActForc], 
      ROW_NUMBER() OVER (ORDER BY [DATE]) as rn 
    FROM myTable 
), cte_name ([Date], [Group], [Count], [level]) AS 
(
    SELECT [Date], [Group], [Count], 1 as [level] 
    FROM addID 
    WHERE rn = 1 
    UNION ALL 
    SELECT A.[Date], 
      A.[Group], 
      CASE WHEN [ActForc] = 'F' THEN C.[Count] + A.[Count] 
       ELSE A.[Count] 
      END AS [Count], 
      C.[level] + 1 
    FROM addID A 
    INNER JOIN cte_name C 
      ON A.rn = C.[level] + 1 
) 
SELECT * 
FROM cte_name 

輸出

|      Date | Group | Count | level | 
|----------------------------|-------|-------|-------| 
| November, 01 2015 00:00:00 | GrpA | 10 |  1 | 
| December, 01 2015 00:00:00 | GrpA | 12 |  2 | 
| January, 01 2016 00:00:00 | GrpA | 11 |  3 | 
| February, 01 2016 00:00:00 | GrpA | 13 |  4 |