2012-06-13 28 views
1

我有一張表列出了不同活動的持續時間。它看起來像總結一列到某一行(使用GROUP BY和OVER)?

id duration 
1 15 
2 30  
3 30 
4 45 
5 30 

...等

我要總結像

for (lastActivity=1 to 5) 
    SELECT id, SUM(duration) FROM durations 
    WHERE id<=lastActivity 

這些活動產生類似

id endtime 
1 15 
2 45 
3 75 
4 120 
5 150 

的輸出,其中每個行總和的持續時間的活動直至其在清單中的位置。

這似乎是一個簡單的任務(可能是),但我不知道如何看起來像生產這樣的輸出的SQL。我曾嘗試使用GROUP BY與OVER子句,但也許有一個更簡單的方法來做到這一點。

回答

1
SELECT t.id, 
     t.duration, 
     rt.runningTotal 
FROM mytable t 
     CROSS apply (SELECT Sum(duration) AS runningTotal 
        FROM emp 
        WHERE id <= t.id) AS rt 
ORDER BY t.id 

APPLY運營商允許你調用表值函數對於查詢的外部表表達式返回的每一行。表值函數充當正確的輸入,而外部表格表達式充當左邊的輸入。對於左輸入的每一行評估正確的輸入,並將生成的行組合爲最終輸出。 APPLY運算符生成的列列表是左輸入中的一組列,後跟右輸入返回的列列表。

注意:要使用APPLY,數據庫兼容級別必須至少爲90。這是在SQL Server 2005推出

0

這將降低取決於你的實際的表有多大,但是這應該做的伎倆: 一些解決這個有趣的閱讀可以發現here

SELECT 1 as id, 15 as num into #test 
UNION ALL SELECT 2, 30  
UNION ALL SELECT 3, 30 
UNION ALL SELECT 4, 45 
UNION ALL SELECT 5, 30 

select 
t1.id 
,MAX(t1.num) as id_num 
,SUM(t2.num) as running_total 
from #test t1 
LEFT OUTER JOIN #test t2 on t2.id <= t1.id 
GROUP BY 
t1.id 
0

試試這個:

select d2.ID,sum(d1.duration) 
from durations d1,durations d2 
where d1.id<=d2.id 
group by d2.id