次の構造のデータベースがあります。
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 コードを作成する必要がありますか?