2

MySQL に 2 つのテーブルがあります。これらの各テーブルには、デバイスの MAC アドレスと状態領域の情報が保存されています。

これらの状態は、特定のタイムスタンプ (startTime、endTime) とその期間 (endTime-startTime) で開始および終了し、特定の ID によって引き起こされます。

ここで、次のように、特定のイベント「移動」と「ロード」の間の重複を日で区切って見つけたいと思います。

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)

クエリの結果は次のようになります。

ID                  DATE                            ALL_MOVEMENT    ALL_LOAD    LOAD_MOVEMENT
00:50:c2:63:10:1a   October, 29 2012 00:00:00+0000  421             520         391
00:50:c2:63:10:1a   February, 22 2013 00:00:00+0000 421             520         391
00:50:c2:63:10:1b   February, 22 2013 00:00:00+0000 181             220         181

ここでフィドルを用意しました: http://sqlfiddle.com/#!2/c210c

更新:別のテーブル構造で必要なものを提供するフィドルは、ここで見ることができます:

http://sqlfiddle.com/#!2/31b94/1

4

2 に答える 2

4

データセットが結果セットとどのように相関するかはよくわかりませんが、多かれ少なかれこのようなものが必要なようです...

 SELECT m.id
      , DATE(FROM_UNIXTIME(m.starttime))Date,SUM(m.duration) all_movement
      , SUM(l.duration) all_load
   FROM move_table m
   JOIN load_table l
     ON l.id = m.id
    AND l.endtime > m.starttime
    AND l.starttime < m.endtime
  GROUP 
     BY m.id
      , DATE(FROM_UNIXTIME(m.starttime));
 +-------------------+------------+--------------+----------+
 | id                | Date       | all_movement | all_load |
 +-------------------+------------+--------------+----------+
 | 00:50:c2:63:10:1a | 2012-10-29 |          391 |      520 |
 | 00:50:c2:63:10:1a | 2013-02-22 |          391 |      520 |
 | 00:50:c2:63:10:1b | 2013-02-22 |          181 |      220 |
 +-------------------+------------+--------------+----------+

ちなみに、duration(たとえば) SUM(m.endtime-m.starttime) でも同じ結果が得られるため、このコンテキストでは冗長に見えます。

于 2013-03-14T12:05:26.980 に答える
3

データベースには実際の情報がないため、「ロード」と「ロードなし」の違いを解決する方法はわかりませんが、これはあなたが試してみるための出発点かもしれません.

SELECT a.ID, a.D, SUM(a.MOVETIME) AS ALL_MOVEMENT, SUM(a.LOADTIME) AS ALL_LOAD
FROM (
SELECT ID, DATE(FROM_UNIXTIME(startTime)) AS d, SUM(duration) AS MOVETIME, 0 AS LOADTIME
FROM move_table
GROUP BY ID, DATE(FROM_UNIXTIME(startTime))
UNION
SELECT ID, DATE(FROM_UNIXTIME(startTime)) AS d, 0 AS MOVETIME, SUM(duration) AS LOADTIME
FROM load_table
GROUP BY ID, DATE(FROM_UNIXTIME(startTime))) AS a
GROUP BY a.ID, a.D
于 2013-03-14T11:55:58.643 に答える