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 查询,我可以获得一行和下一行之间的 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

因此,我想计算每一天的平均值、最小值、最大值、方差、标准差。

我知道 MySQL 有 DATE-Functions 但我无法完成...有人可以帮助我吗?还是我必须编写一段可以处理这个问题的 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 回答