2012-02-06 118 views
1

之間的數值爲下表時一般方法:需要計算行

Id Timestamp AssignedTo 
1  2012-01-01 User1 
2  2012-01-02 User2 
3  2012-01-10 User3 
4  2012-01-15 User1 

這將是在MS SQL Server中的一般方法來計算該實體多少天/小時/分鐘分配到一個特定的用戶?

作爲一名開發人員(擁有基本的SQL知識),我在做這些查詢時總是選擇函數或存儲過程(這類查詢包括基於集合中兩行之間差異的結果)。

在這個例子中,我將有一個遊標迭代項目,保留前一個變量,然後計算差異。不過,我被告知這是一個嚴重的性能問題,特別是在大型設備上。

編輯:樣品結果

User TotalTime 
User1 23d 
User2 8d 
User3 5d 

即項被分配給特定用戶的總時間。 User1的總時間爲23天,因爲自2012-01-15(現在是2012-02-06)以來,User1的總時間已分配給他,並且分配給他的第一天。

+0

根據數據庫,可以使用高級SQL功能,那麼這是什麼數據庫?此外,你能提供一些例子輸出嗎?我不確定你期望得到什麼結果... – 2012-02-06 09:19:49

+0

添加了示例數據和MSSQL DBMS。 – grimstoner 2012-02-06 09:45:48

+0

太糟糕了,它是MSSQL/SQL Server,所以你不能使用'ROWS 1 PRECEDING'和類似的窗口函數結構。但在這裏看看這個問題,它將包含一些類似問題的答案:http://stackoverflow.com/questions/860966/calculate-a-running-total-in-sqlserver – 2012-02-06 09:48:44

回答

2

在這個例子中,我會使用select語句中的子查詢來獲取每一行的結束日期,然後使用這個結束日期來獲得分配給特定用戶的時間。以下是SQL Server語法,但是無論RDBMS如何,都可以應用相同的主體。

SELECT AssignedTo, 
     SUM(DATEDIFF(DAY, TimeStamp, ISNULL(EndDate, GETDATE()))) [Days] 
FROM ( SELECT ID, 
        [TimeStamp], 
        AssignedTo, 
        ( SELECT MIN(TimeStamp) 
         FROM [YOURTABLE] b 
         WHERE b.TimeStamp > a.TimeStamp 
        ) [EndDate] 
      FROM [YOURTABLE] a 
     ) a 
GROUP BY AssignedTo 
+0

+1天才答案! – 2012-02-06 15:43:59

+0

儘管我一直在尋找一種通用的方法,但這個答案讓我想起了......我相信所謂的集合論的一個實際例子。 – grimstoner 2012-02-06 18:55:06