-1

アクティビティとその期間を実行順に一覧表示するテーブルがあります。つまり、テーブルは時間で並べ替えられています。主に4つの列があります:

person_ID、duration、activity_ID、time

特定のactivity_IDに達するまでの期間を合計するにはどうすればよいですか?activity_IDで記述されたアクティビティは、任意の順序で実行できます。

テーブルには、たとえば、起き上がる、シャワーを浴びる、剃る、食べる、着替える、靴を履くなど、日中の活動を一覧表示できます。順序と活動は人と日によって異なります。

「服を着る」などの特定の活動が停止するまでのすべての活動の期間を合計したいと思います。SQLでこれを行うにはどうすればよいですか?

4

2 に答える 2

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 
于 2012-07-23T12:06:51.243 に答える
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

これは、各ユーザーのアクティビティが発生した最小時間を見つけて、それらの期間を合計するだけです。

于 2012-07-23T13:26:50.713 に答える