2012-07-23 62 views
-1

我有一个表,列出活动及其持续时间的顺序,即表按时间排序。它主要有四列:

person_ID,持续时间,活动ID,时间

如何累计持续时间直到达到某个activity_ID? activity_ID描述的活动可以按任何顺序进行。

这张桌子可以列举白天的活动,例如起床,淋浴,刮胡子,吃饭,穿好衣服,穿上鞋子。订单和活动因人而异。

我想总结所有活动的持续时间,直到某个活动例如“穿好衣服”,然后停下来。我如何在SQL中做到这一点?总计一列,直到另一列中的具体值

+0

什么版本的SQL Server? – 2012-07-23 11:47:45

+0

对activity_ID没有排序? – Matten 2012-07-23 11:48:36

+2

除非您专门订购结果集,否则不保证订购。仅仅因为你在记录之前插入记录b并不意味着当你查询/操作数据/表记录时,a总是会返回记录b的“之前”(除非特别要求)。 – 2012-07-23 11:53:03

回答

1

不知道这是您正在寻找的内容,而是一种常规技术:根据您是否要包含该标记来打开或关闭某个标记,然后将所有记录与标记相加。

create table activity(person_ID number, duration number, activity_ID number) 

insert into activity values(1, 1, 1); 
insert into activity values(1, 2, 2); 
insert into activity values(1, 3, 3); 
insert into activity values(1, 4, 4); 
insert into activity values(1, 5, 5); 

insert into activity values(2, 10, 1); 
insert into activity values(2, 20, 2); 
insert into activity values(2, 30, 3); 
insert into activity values(2, 40, 4); 
insert into activity values(2, 50, 5); 

SELECT person_id, SUM(CASE WHEN activity_id <= 3 THEN duration ELSE 0 END) AS sum_till_3 
    FROM activity 
    GROUP BY person_id 
    ORDER BY person_id 

PERSON_ID SUM_TILL_3 
--------- ---------- 
     1   6 
     2   60 
+0

感谢您的回答,但它不会工作,因为您认为activity_id是一个有序集合,它不在我的示例中。我想总结持续时间,直到出现某个activity_id。或者,换句话说,表格按除activity_id之外的另一列进行排序。 – user1453235 2012-07-23 13:05:26

0

这里是你如何能与普通窗口的功能做到这一点:

select t.user_id, sum(time <= activity_time then duration else 0 end) 
from (select t.*, 
      min(activitytime) over (partition by user_id) as activitytime 
     from (select t.*, 
        (case when activity_id = xxx then 1 else 0 end) as isactivity, 
        (case when activity_id = xxx then time end) as activitytime, 
      from t 
      ) t 
    ) t 
group by user_id 

这只是发现当活动发生的每个用户的最小时间,然后添加了持续时间为他们。

+0

一个漂亮的例子。经过一些修改后,代码看起来像下面,完美的作品! SELECT rt.user_id,SUM(CASE WHEN rt.time user1453235 2012-07-30 09:30:01

相关问题