2011-06-15 42 views
0

有人可以幫助我找出4個連續值的總和,即滾動最後4個值的總和。用於查找4個連續值的總和的SQL Server查詢

像:

VALUE SUM 
1 NULL 
2 NULL 
3 NULL 
4 10 
5 14 
6 18 
7 22 
8 26 
9 30 
10 34 
11 38 
12 42 
13 46 
14 50 
15 54 
16 58 
17 62 
18 66 
19 70 
20 74 
21 78 
22 82 
23 86 
24 90 
25 94 
26 98 
27 102 
28 106 
29 110 
30 114 
31 118 
32 122 
33 126 
34 130 
35 134 
36 138 
37 142 
38 146 

感謝,

+1

數字*總是*增加4嗎? – gbn 2011-06-15 13:59:43

回答

0
select sum(select top 4 Value from [table] order by Value Desc) 

,或許

select sum(value) 
from [Table] 
where Value >= (Max(Value) - 4) 

我還沒有真正嘗試的those-要麼並且不能在此刻,但他們應該讓你非常接近。

0

假設ID可以給你最後4行。

SELECT SUM([SUM]) 
FROM 
    (
    SELECT TOP 4 [SUM] FROM myTable ORDER BY ID DESC 
    ) foo 

每次查詢它時,它都會讀取最後4行。

如果這是錯誤的(例如,你希望每個連續的4行的總和),那麼請給樣本輸出

0

快速的嘗試,它讓你已經張貼在你的問題的結果(除了一日3行不是NULL)。假定值字段是唯一的,按升序排列:

-- Create test TABLE with 38 values in 
DECLARE @T TABLE (Value INTEGER) 
DECLARE @Counter INTEGER 
SET @Counter = 1 
WHILE (@Counter <= 38) 
    BEGIN 
     INSERT @T VALUES(@Counter) 
     SET @Counter = @Counter + 1 
    END 

-- This gives the results 
SELECT t1.VALUE, x.Val 
FROM @T t1 
    OUTER APPLY(SELECT SUM(VALUE) FROM (SELECT TOP 4 VALUE FROM @T t2 WHERE t2.VALUE <= t1.VALUE ORDER BY t2.VALUE DESC) x) AS x(Val) 
ORDER BY VALUE 

最起碼,你應該看到樣的方向我是標題中

0

繼會工作,如果你的Value列順序

;WITH q (Value) AS (
    SELECT 1 
    UNION ALL 
    SELECT q.Value + 1 
    FROM q 
    WHERE q.Value < 38 
) 

SELECT q.Value 
     , CASE WHEN q.Value >= 4 THEN q.Value * 4 - 6 ELSE NULL END 
FROM q  

,否則你可能會使用這樣的事情

;WITH q (Value) AS (
    SELECT 1 
    UNION ALL 
    SELECT q.Value + 1 
    FROM q 
    WHERE q.Value < 38 
) 
, Sequential (ID, Value) AS (
    SELECT ID = ROW_NUMBER() OVER (ORDER BY Value) 
      , Value 
    FROM q 
) 
SELECT s1.Value 
     , [SUM] = s1.Value + s2.Value + s3.Value + s4.Value 
FROM Sequential s1 
     LEFT OUTER JOIN Sequential s2 ON s2.ID = s1.ID - 1 
     LEFT OUTER JOIN Sequential s3 ON s3.ID = s2.ID - 1 
     LEFT OUTER JOIN Sequential s4 ON s4.ID = s3.ID - 1 

請注意,示例中的表q是您的實際表的存根。然後實際的語句變成

;WITH Sequential (ID, Value) AS (
    SELECT ID = ROW_NUMBER() OVER (ORDER BY Value) 
      , Value 
    FROM YourTable 
) 
SELECT s1.Value 
     , [SUM] = s1.Value + s2.Value + s3.Value + s4.Value 
FROM Sequential s1 
     LEFT OUTER JOIN Sequential s2 ON s2.ID = s1.ID - 1 
     LEFT OUTER JOIN Sequential s3 ON s3.ID = s2.ID - 1 
     LEFT OUTER JOIN Sequential s4 ON s4.ID = s3.ID - 1