我有一张表格,列出了不同活动的持续时间。它看起来像
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子句一起使用,但也许有一种更简单的方法。
答案 0 :(得分:1)
答案 1 :(得分: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中引入的。
答案 2 :(得分: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
答案 3 :(得分:0)
试试这个:
select d2.ID,sum(d1.duration)
from durations d1,durations d2
where d1.id<=d2.id
group by d2.id