1

タイムスタンプ付きの一連のオン/オフ データがテーブルにあり、オン/オフ状態、または状態が「開始」するポイントを表します。

00:00:00    0
04:00:00    1
08:00:00    0
09:00:00    1
15:00:00    0
20:00:00    1
23:59:59    0

24 時間にわたる (たとえば) ON 状態の合計期間を計算する必要があります。

この簡略化された例では、合計期間 = 1 は (04:00:00->08:00:00、09:00:00->15:00:00、20:00:00->23:59:59、つまり 13 :59:59 約14時間

これが SQL だけで実行できるかどうか、または私が使用している基礎となるフレームワーク (django) が返されたデータに基づいてこれを実行する必要があるかどうかを判断できません。別の統計パッケージでも SQL を使用する必要がある可能性があるため、可能であればデータベースに面倒な作業を行わせたいと考えています。

select の前または次の要素に対して (たとえば) 操作を実行できるかどうかは明確ではありません。私は自信のある SQL ユーザーですが、これまたは一般化されたアプローチのどこから始めればよいかわかりません。アイデアはありますか?

私はこれを単一のクエリで本当に望んでいます。または、これを計算する他の巧妙な方法が欠けています!

4

1 に答える 1

1

MySQL にはありrow_number()ませんが、二重結合を実行して前の行を検索できます。

select 
    sum(case when cur.state = 0 then 0
        else subtime(cur.timeCol, prev.timeCol)
        end) as TotalOnTime
from YourTable cur
join YourTable prev
    on prev.timeCol < cur.timeCol
left join YourTable inbetween
    on prev.timeCol < inbetween.timeCol
    and inbetween.timeCol < cur.timeCol
where inbetween.timeCol is null;

MySQL では、変数を使用することもできます。この場合、おそらくより効率的です。

set @total := '00:00:00';
set @lasttime := '00:00:00';

select 
    @total := addtime(@total, case 
        when state = 0 then 0
        when @lasttime is null then 0
        else subtime(timeCol, @lasttime)
        end)
,   @lasttime := timeCol
from YourTable
order by timeCol;

select 'Result = ', @total;

テスト テーブルを作成してデータを入力するコード:

DROP TABLE IF EXISTS YourTable;
CREATE TABLE YourTable (
   timeCol time,
   state bit
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

insert into YourTable values ('00:00:00',    0);
insert into YourTable values ('04:00:00',    1);
insert into YourTable values ('08:00:00',    0);
insert into YourTable values ('09:00:00',    1);
insert into YourTable values ('15:00:00',    0);
insert into YourTable values ('20:00:00',    1);
insert into YourTable values ('23:59:59',    0);
于 2010-02-10T15:21:49.463 に答える