1

次の構造のデータベースがあります。

rowid       ID                  startTimestamp   endTimestamp   subject
1           00:50:c2:63:10:1a   ...1000          ...1090        entrance
2           00:50:c2:63:10:1a   ...1100          ...1270        entrance
3           00:50:c2:63:10:1a   ...1300          ...1310        door1
4           00:50:c2:63:10:1a   ...1370          ...1400        entrance
.
.
.

この SQL-Query を使用すると、ある行と次の行の間の endTime と startTime の平均差を、件名と ID で並べ替え、最小、最大、分散、標準偏差で取得できます。

SELECT ID,AVG(diff) AS average,
   AVG(diff*diff) - AVG(diff)*AVG(diff) AS variance,
   SQRT(AVG(diff*diff) - AVG(diff)*AVG(diff)) AS stdev,
   MIN(diff) AS minTime,
   MAX(diff) AS maxTime

FROM
(SELECT t1.id, t1.endTimestamp,
        min(t2.startTimeStamp) - t1.endTimestamp AS diff
FROM table1 t1
INNER JOIN table1 t2
ON t2.ID = t1.ID AND t2.subject = t1.subject
AND t2.startTimestamp > t1.startTimestamp  -- consider only later startTimestamps
WHERE t1.subject = 'entrance'
GROUP BY t1.id, t1.endTimestamp) AS diffs
GROUP BY ID

これは問題なく動作します。同じ日に時間差が少ない数行しかない場合は、次の sqlfiddle で確認できます。

http://sqlfiddle.com/#!2/6de73/1

しかし、別の日に追加のデータがあると、悪い値が得られます。

http://sqlfiddle.com/#!2/920b6/1

したがって、平均、最小、最大、分散、標準偏差を 1 日ごとに計算したいと思います。

MySQL の DATE 関数があることは知っていますが、実行できませんでした...誰か助けてくれませんか? または、これを処理できる PHP コードを作成する必要がありますか?

4

1 に答える 1

3

に日付を追加するのと同じくらい簡単ですかgroup by。以下は、MySQL と SQLite の両方で機能するはずの構文です。日付は終了時刻に基づいており、終了時刻は日時として格納されていると想定しています。

SELECT ID, thedate, AVG(diff) AS average,
   AVG(diff*diff) - AVG(diff)*AVG(diff) AS variance,
   SQRT(AVG(diff*diff) - AVG(diff)*AVG(diff)) AS stdev,
   MIN(diff) AS minTime,
   MAX(diff) AS maxTime
FROM (SELECT t1.id, t1.endTimestamp, DATE(endtimestamp) as thedate,
             min(t2.startTimeStamp) - t1.endTimestamp AS diff
      FROM table1 t1 INNER JOIN
           table1 t2
           ON t2.ID = t1.ID AND t2.subject = t1.subject AND
              t2.startTimestamp > t1.startTimestamp  -- consider only later startTimestamps
     WHERE t1.subject = 'entrance'
     GROUP BY t1.id, t1.endTimestamp
    ) AS diffs
GROUP BY ID, thedate

タイムスタンプとして保存されている場合は、Marty のコメントを参照してください。

于 2013-01-23T14:09:51.467 に答える