2015-04-07 31 views
1

我有一個表,其中記錄在不同時段插入(每個記錄包含一個名爲'Amount'的列)。作爲基於時間段的累計求和的列

我想在每5秒後顯示總數量。我曾與下面的查詢嘗試沒有成功:

SELECT Sum(totalamount) AS RealTimeTotalAmount, 
     Datepart(second, createstamp)/5 AS dp 
FROM [order] 
WHERE 
     createstamp BETWEEN Dateadd(s, -5, Getdate()) AND Getdate() 
GROUP BY Datepart(second, createstamp)/5 

我現在面臨的問題是,它讓我看到了「累計金額按每一秒」,我想看看它像「(累計金額爲每每一秒+總金額累計到那第二)」

這裏是源數據的樣子:

----------------------------------------------------------- 
|OrderID | CreateStamp    | TotalAmount   | 
----------------------------------------------------------- 
|1  |2015-03-22 15:26:05.620 | 10     | 
----------------------------------------------------------- 
|2  |2015-03-22 15:26:05.653 | 20     | 
----------------------------------------------------------- 
|3  |2015-03-22 15:26:05.660 | 10     | 
----------------------------------------------------------- 
|4  |2015-03-22 15:26:06.663 | 10     | 
----------------------------------------------------------- 
|5  |2015-03-22 15:26:06.670 | 30     | 
----------------------------------------------------------- 

從本質上講,我希望得到的查詢返回如下:

---------------------------------------- 
|Period   | Accumulative Amount | 
---------------------------------------- 
|0 to 5 seconds | 30     | 
---------------------------------------- 
|0 to 10 seconds | 80     | 
---------------------------------------- 

這基本上是一個從0時間到5的倍數的累計。對於最近5秒,基本上我計算了整天的時間,直到我執行這個查詢的時間,例如前一天的金額這次是50,所以結果表應該看起來像

---------------------------------------- 
|0 to 5 seconds | 30 + 50 = 80  | 
---------------------------------------- 
|0 to 10 seconds | 80 + 80 = 160  | 
---------------------------------------- 
+0

什麼版本的SQL Server您使用的是? SQL Server 2012中的窗口函數有顯着的改進。 –

+0

我使用的SQL Server 2008 – rashfmnb

回答

1

你可以嘗試這樣的事情。

輸入數據

DECLARE @Orders TABLE 
(
    OrderId INT, 
    CreateStamp DATETIME, 
    TotalAmount NUMERIC(9,2) 
) 
INSERT INTO @Orders 
SELECT 1,'2015-03-22 15:26:05.620',400 
UNION ALL SELECT 2,'2015-03-22 15:26:04.653',500 
UNION ALL SELECT 3,'2015-03-22 15:26:05.660',600 
UNION ALL SELECT 4,'2015-03-22 15:26:06.663',700 
UNION ALL SELECT 5,'2015-03-22 15:26:06.670',900 
UNION ALL SELECT 6,'2015-03-22 15:26:05.660',600 
UNION ALL SELECT 7,'2015-03-22 15:26:09.663',700 
UNION ALL SELECT 8,'2015-03-22 15:26:12.670',900 

查詢

;WITH CTE as 
(
    SELECT DATEDIFF(minute,0,CreateStamp)totalminutes,Datepart(second, CreateStamp)/5 sec,SUM(TotalAmount) TotalAmount 
    FROM @Orders 
    GROUP BY DATEDIFF(minute,0,CreateStamp),Datepart(second, CreateStamp)/5 
) 
SELECT DATEADD(minute,totalminutes,0) dt,sec,(SELECT SUM(TotalAmount) FROM cte WHERE totalminutes <=c2.totalminutes and sec <=c2.sec) 
FROM CTE c2 
ORDER BY sec; 

我添加了一個GROUP BY DATEDIFF(minute,0,CreateStamp)到單獨秒不同的日期和分鐘。

+0

感謝與小調整它適用於我 – rashfmnb

0

如果我理解正確:

DECLARE @t TABLE 
    (
     ID INT , 
     D DATETIME , 
     A MONEY 
    ) 
DECLARE @mind DATETIME , 
    @maxd DATETIME 


INSERT INTO @t 
VALUES (1, '2015-04-07 13:49:15.000', 5), 
     (2, '2015-04-07 13:49:17.000', 15), 
     (3, '2015-04-07 13:49:35.000', 2), 
     (4, '2015-04-07 13:49:45.000', 4), 
     (5, '2015-04-07 13:49:49.000', 20), 
     (6, '2015-04-07 13:50:05.000', 20), 
     (7, '2015-04-07 13:50:09.000', 3), 
     (8, '2015-04-07 13:50:09.000', 3), 
     (9, '2015-04-07 13:50:10.000', 1), 
     (10, '2015-04-07 13:50:15.000', 1) 


SELECT @mind = MIN(d) , 
     @maxd = MAX(d) 
FROM @t; 

WITH cte 
      AS (SELECT @mind AS d 
       UNION ALL 
       SELECT DATEADD(ss, 5, d) 
       FROM  cte 
       WHERE cte.d <= @maxd 
      ) 

SELECT cte.d, SUM(A) AS A FROM cte 
JOIN @t t ON t.D < cte.d 
GROUP BY cte.d 

輸出:

d      A 
2015-04-07 13:49:20.000 20.00 
2015-04-07 13:49:25.000 20.00 
2015-04-07 13:49:30.000 20.00 
2015-04-07 13:49:35.000 20.00 
2015-04-07 13:49:40.000 22.00 
2015-04-07 13:49:45.000 22.00 
2015-04-07 13:49:50.000 46.00 
2015-04-07 13:49:55.000 46.00 
2015-04-07 13:50:00.000 46.00 
2015-04-07 13:50:05.000 46.00 
2015-04-07 13:50:10.000 72.00 
2015-04-07 13:50:15.000 73.00 
2015-04-07 13:50:20.000 74.00