在一定时间内在一个mysql数据库中的时间平均值

时间:2018-01-11 10:03:13

标签: mysql

所以即时尝试在20分钟内获得时间平均值并将其从我的主sql表添加到辅助表中,该数字将在一天中的几次进入数据库,并且在第一次进入数据库时​​效果很好但是如果它在当天晚些时候进入,它会将辅助表更新为更高的平均值,例如

数字58在上午12:08进入,然后在上午12:31停止进入平均23分钟如果然后在下午13:47返回到桌子并且在下午14:13出去它将显示2小时5分钟

我目前正在使用

insert into test.time (beacon,location,date,time_avg,mac,time)
SELECT beacon,location,date, 
TIMEDIFF(max(`time`),min(`time`)) AS `time_avg`,mac,time
FROM test.test where time > now() - interval 30 minute
group by beacon
ORDER BY `time_avg` DESC

我如何查询它以便它添加一个半小时左右的新行我确实尝试使用一个事件,它每30分钟只查询一次,而不是每次更新后但我仍然遇到同样的问题,我也试过插入忽略,其中mac是一个唯一值并替换为。

我附上了我的表格图片,以了解其中的数据。

为方便起见,

字符串中的示例数据

insert into test ('location','beacon','mac','date','time') VALUES (YELLOW, 1,AC3422845D, 2018-01-10, 12:08:55);

mysql table data

1 个答案:

答案 0 :(得分:0)

您需要查看很多内容,并且可能会在insert..select中修复。如果您的目标是在每个beacon,mac,date的插入表中有1条记录,那么重复键上的插入可能就是您想要的。例如

MariaDB [沙盒]> drop table if t; 查询OK,0行受影响(0.27秒)

MariaDB [sandbox]>
MariaDB [sandbox]> create table t
    -> (location varchar(20),beacon int, mac varchar(20),`date` date, `time` time);
Query OK, 0 rows affected (0.20 sec)

MariaDB [sandbox]> insert into t (location,beacon,mac,`date`,`time`) VALUES ('YELLOW', 1,'AC3422845D', '2018-01-10', '11:00:44');
Query OK, 1 row affected (0.01 sec)

MariaDB [sandbox]> insert into t (location,beacon,mac,`date`,`time`) VALUES ('YELLOW', 1,'AC3422845D', '2018-01-11', '10:00:55');
Query OK, 1 row affected (0.01 sec)

MariaDB [sandbox]> insert into t (location,beacon,mac,`date`,`time`) VALUES ('YELLOW', 1,'AC3422845D', '2018-01-11', '11:00:55');
Query OK, 1 row affected (0.05 sec)

MariaDB [sandbox]> insert into t (location,beacon,mac,`date`,`time`) VALUES ('YELLOW', 1,'AC3422845D', '2018-01-11', '12:00:55');
Query OK, 1 row affected (0.02 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> drop table if exists t1;
Query OK, 0 rows affected (0.08 sec)

MariaDB [sandbox]> create table t1
    -> (beacon int,location varchar(20), mac varchar(20),`date` date, maxtimetime  time, mintime time, obs int, now30 datetime);
Query OK, 0 rows affected (0.26 sec)

MariaDB [sandbox]> alter table t1
    -> add unique key  t1k1 (beacon,mac,`date`);
Query OK, 0 rows affected (0.18 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [sandbox]>
MariaDB [sandbox]>
MariaDB [sandbox]> #select * from t;
MariaDB [sandbox]> #select @now;
MariaDB [sandbox]>
MariaDB [sandbox]> truncate table t1;
Query OK, 0 rows affected (0.27 sec)

MariaDB [sandbox]> set @now = str_to_date('2018-01-10 11:15:00','%Y-%m-%d %H:%i:%s');
Query OK, 0 rows affected (0.00 sec)

MariaDB [sandbox]> insert into t1 (beacon ,mac ,`date`, maxtimetime, mintime, obs, now30)
    -> select *
    -> from
    -> (select t.beacon,t.mac,t.`date`, max(`time`) maxtime,min(`time`) mintime,count(*) obs,
    -> @now - interval 30 minute now30
    -> from t
    -> where `time`  between time(@now - interval 30 minute) and time(@now) and `date` = date(@now)
    -> group by t.beacon ,t.mac,t.`date`
    -> ) s
    -> on duplicate key
    -> update maxtimetime = s.maxtime, mintime = s.mintime, obs = s.obs, now30 = s.now30;
Query OK, 1 row affected (0.03 sec)
Records: 1  Duplicates: 0  Warnings: 0

MariaDB [sandbox]>
MariaDB [sandbox]> select * from t1;
+--------+----------+------------+------------+-------------+----------+------+---------------------+
| beacon | location | mac        | date       | maxtimetime | mintime  | obs  | now30               |
+--------+----------+------------+------------+-------------+----------+------+---------------------+
|      1 | NULL     | AC3422845D | 2018-01-10 | 11:00:44    | 11:00:44 |    1 | 2018-01-10 10:45:00 |
+--------+----------+------------+------------+-------------+----------+------+---------------------+
1 row in set (0.00 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> set @now = str_to_date('2018-01-11 11:15:00','%Y-%m-%d %H:%i:%s');
Query OK, 0 rows affected (0.00 sec)

MariaDB [sandbox]> insert into t1 (beacon ,mac ,`date`, maxtimetime, mintime, obs, now30)
    -> select *
    -> from
    -> (select t.beacon,t.mac,t.`date`, max(`time`) maxtime,min(`time`) mintime,count(*) obs,
    -> @now - interval 30 minute now30
    -> from t
    -> where `time` between time(@now - interval 30 minute) and time(@now) and `date` = date(@now)
    -> group by t.beacon ,t.mac,t.`date`
    -> ) s
    -> on duplicate key
    -> update maxtimetime = s.maxtime, mintime = s.mintime, obs = s.obs, now30 = s.now30;
Query OK, 1 row affected (0.03 sec)
Records: 1  Duplicates: 0  Warnings: 0

MariaDB [sandbox]>
MariaDB [sandbox]> select * from t1;
+--------+----------+------------+------------+-------------+----------+------+---------------------+
| beacon | location | mac        | date       | maxtimetime | mintime  | obs  | now30               |
+--------+----------+------------+------------+-------------+----------+------+---------------------+
|      1 | NULL     | AC3422845D | 2018-01-10 | 11:00:44    | 11:00:44 |    1 | 2018-01-10 10:45:00 |
|      1 | NULL     | AC3422845D | 2018-01-11 | 11:00:55    | 11:00:55 |    1 | 2018-01-11 10:45:00 |
+--------+----------+------------+------------+-------------+----------+------+---------------------+
2 rows in set (0.00 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> set @now = str_to_date('2018-01-11 12:15:00','%Y-%m-%d %H:%i:%s');
Query OK, 0 rows affected (0.00 sec)

MariaDB [sandbox]> insert into t1 (beacon ,mac ,`date`, maxtimetime, mintime, obs, now30)
    -> select *
    -> from
    -> (select t.beacon,t.mac,t.`date`, max(`time`) maxtime,min(`time`) mintime,count(*) obs,
    -> @now - interval 30 minute now30
    -> from t
    -> where `time`  between time(@now - interval 30 minute) and time(@now) and `date` = date(@now)
    -> group by t.beacon ,t.mac,t.`date`
    -> ) s
    -> on duplicate key
    -> update maxtimetime = s.maxtime, mintime = s.mintime, obs = s.obs, now30 = s.now30;
Query OK, 2 rows affected (0.02 sec)
Records: 1  Duplicates: 1  Warnings: 0

MariaDB [sandbox]>
MariaDB [sandbox]> select * from t1;
+--------+----------+------------+------------+-------------+----------+------+---------------------+
| beacon | location | mac        | date       | maxtimetime | mintime  | obs  | now30               |
+--------+----------+------------+------------+-------------+----------+------+---------------------+
|      1 | NULL     | AC3422845D | 2018-01-10 | 11:00:44    | 11:00:44 |    1 | 2018-01-10 10:45:00 |
|      1 | NULL     | AC3422845D | 2018-01-11 | 12:00:55    | 12:00:55 |    1 | 2018-01-11 11:45:00 |
+--------+----------+------------+------------+-------------+----------+------+---------------------+
2 rows in set (0.00 sec)