0

特定のオブジェクトのイベントがリストされているテーブルがあります。

「移動」と「負荷」の2つのイベントがあります。それらは開始および終了することができ、これらのイベントは発生時のタイムスタンプとともにリストされます。

次のリクエストで、次の値を取得できます。

sum of time, when movement took place (value in the fiddle: 421)
sum of time, when load took place (value in the fiddle: 520)
sum of time, when movement and load took place (value in the fiddle: 391)

現在のバージョンでは、これらの数値が DAY ごとに計算されます。これは正常に機能します。

http://sqlfiddle.com/#!2/518dd/1

しかし、私は別のIDも持っています。これらの数値を DAY ごと、ID ごとに計算したいと思います。このデータを追加すると、クラッシュします。このフィドルを参照してください。

http://sqlfiddle.com/#!2/b43fa/6

これは、この質問の重複ではありません。この場合、この質問の解決策は適切ではない/適応可能ではないため、mysql db で行とタイムスタンプの間の交差を検索します。

4

2 に答える 2

2

Gordon が示すように、フィルタリングを最も外側に移動することでグループ化が可能になりますSELECT移動イベントを囲む必要がある読み込みイベントの検索は、前の回答と同じ方法で行われます。

SELECT id,
       date(timestamp, 'unixepoch') AS date,
       (SUM(CASE WHEN event = 'movement end'   THEN timestamp END) -
        SUM(CASE WHEN event = 'movement start' THEN timestamp END)
       ) AS all_movement,
       (SUM(CASE WHEN event = 'load end'   THEN timestamp END) -
        SUM(CASE WHEN event = 'load start' THEN timestamp END)
       ) AS all_load,
       (SUM(CASE WHEN event = 'movement end' AND
                      (SELECT event
                       FROM Table1 b
                       WHERE timestamp = (SELECT MIN(timestamp)
                                          FROM Table1 c
                                          WHERE c.timestamp >= a.timestamp
                                            AND c.id = a.id
                                            AND c.event LIKE 'load %')
                         AND b.id = a.id
                         AND b.event LIKE 'load %'
                      ) = 'load end'
            THEN timestamp END) -
        SUM(CASE WHEN event = 'movement start' AND
                      (SELECT event
                       FROM Table1 b
                       WHERE timestamp = (SELECT MAX(timestamp)
                                          FROM Table1 c
                                          WHERE c.timestamp <= a.timestamp
                                            AND c.id = a.id
                                            AND c.event LIKE 'load %')
                         AND b.id = a.id
                         AND b.event LIKE 'load %'
                      ) = 'load start'
            THEN timestamp END)
       ) AS load_movement
FROM Table1 a
GROUP BY id,
         date(timestamp, 'unixepoch')
于 2013-02-27T21:15:31.163 に答える
2

問題は、開始するクエリです。3番目の列が何であるかを単純に理解していません。ただし、最初の 2 つは、次を使用してはるかに簡単に計算できます。

select (sum(case when event = 'movement end' then timestamp end) -
        sum(case when event = 'movement start' then timestamp end)
       ),
       (sum(case when event = 'load end' then timestamp end) -
        sum(case when event = 'load start' then timestamp end)
       )
from table1

このことから、次の方法でグループを追加するのは簡単です。

select id, date(timestamp),
        (sum(case when event = 'movement end' then timestamp end) -
        sum(case when event = 'movement start' then timestamp end)
       ),
       (sum(case when event = 'load end' then timestamp end) -
        sum(case when event = 'load start' then timestamp end)
       )
from table1
group by id, date(timestamp)
于 2013-02-27T14:49:15.603 に答える