如何限制SQL-result并取平均值?
How to limit SQL-result and take avg?
我正在使用此 SQL-查询 select 特定无线传感器节点的所有值,以根据时间戳绘制图表。
SELECT * FROM measurement
WHERE nodeId = :nodeId
AND datetime BETWEEN :datetimestart
AND :datetimeend
查询的数据通过AJAX发送给客户端。如果时间戳在很长的范围内被 selected,数组会变大并且数据传输需要很长时间。如果数组限制为 100 个条目,那就更好了。仅将查询限制为 100 不能解决问题。
我需要做的是 select 对时间戳的整行进行计算,并取 100 个不同的内部时间戳的平均值。内部时间戳应该是动态的并且取决于外部时间戳。
我不确定如何解决这个问题。是否有可能 select 100 个平均数据取决于带有 SQL 查询的时间戳?还是我需要用 PHP?
解析数组
编辑:
table 测量的结构:
ID nodeID humidity temperature pressure voltage datetime
20519 Node1 46.66 21.39 1013.9 3.313 2017-05-20 10:54:00
20520 Node1 46.87 21.37 1013.9 3.321 2017-05-20 10:54:15
20521 Node1 46.55 21.35 1013.9 3.321 2017-05-20 10:54:30
20522 Node1 46.45 21.35 1013.8 3.321 2017-05-20 10:54:45
20523 Node1 46.68 21.35 1013.9 3.321 2017-05-20 10:55:00
20524 Node1 47.07 21.35 1013.8 3.314 2017-05-20 10:55:15
20525 Node1 47.41 21.36 1013.9 3.321 2017-05-20 10:55:30
20526 Node1 47.51 21.37 1013.9 3.314 2017-05-20 10:55:45
20527 Node1 47.53 21.36 1013.8 3.321 2017-05-20 10:56:00
20528 Node1 46.6 21.33 1013.9 3.321 2017-05-20 10:56:15
20529 Node1 47.14 21.33 1013.9 3.314 2017-05-20 10:56:30
20530 Node1 47.13 21.33 1013.9 3.313 2017-05-20 10:56:46
20531 Node1 48.22 21.36 1013.9 3.321 2017-05-20 10:57:01
20532 Node1 49.96 21.39 1013.9 3.321 2017-05-20 10:57:16
20533 Node1 49.49 21.43 1013.9 3.321 2017-05-20 10:57:31
20534 Node1 49.53 21.49 1014.0 3.321 2017-05-20 10:57:46
编辑 2 我写了一个 pythontool 来创建 sqlite 数据库:
import sqlite3
conn = sqlite3.connect('/var/www/sqliteDatabases/database_sdr.db') #connect to database "database.db"
cur = conn.cursor() #create a cursor
cur.execute('PRAGMA foreign_keys = ON') #enables the FOREIGN KEY constraint
#______create table for temperature and humidity with date and time______
cur.execute('''CREATE TABLE measurement(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
nodeId text,
humidity float,
temperature float,
pressure float,
voltage float,
datetime text)''')
conn.commit()
conn.close()
在下面的 SQLite 查询中,我们为每一行计算 period
,并使用它来对结果进行分组:
SELECT AVG(humidity) AS avgHumidity,
AVG(temperature) AS avgTemperate,
AVG(pressure) AS avgPressure,
AVG(voltage) AS avgVoltage,
round(100*(julianday(datetime)-julianday(:datetimestart))/
(julianday(:datetimeend)-julianday(:datetimestart))) AS period
FROM measurement
WHERE nodeId = :nodeId AND
datetime BETWEEN :datetimestart AND :datetimeend
GROUP BY period
所以基本上您需要对结果进行分组。几点说明:
- 我使用了
julianday()
函数来进行加减运算
除法,这可能不是在 SQLite3 中执行此操作的正确方法。
- 我多次重复使用
:datetimestart
和 :datetimeend
。在 MySQL
这是不允许的。不知道在sqlite3中是否允许。如果它
不是简单地重命名它们:datetimeend1
、:datetimeend2
等
- 这只是一个未经测试的朝正确方向的推动。具体细节你自己想。
我正在使用此 SQL-查询 select 特定无线传感器节点的所有值,以根据时间戳绘制图表。
SELECT * FROM measurement
WHERE nodeId = :nodeId
AND datetime BETWEEN :datetimestart
AND :datetimeend
查询的数据通过AJAX发送给客户端。如果时间戳在很长的范围内被 selected,数组会变大并且数据传输需要很长时间。如果数组限制为 100 个条目,那就更好了。仅将查询限制为 100 不能解决问题。
我需要做的是 select 对时间戳的整行进行计算,并取 100 个不同的内部时间戳的平均值。内部时间戳应该是动态的并且取决于外部时间戳。
我不确定如何解决这个问题。是否有可能 select 100 个平均数据取决于带有 SQL 查询的时间戳?还是我需要用 PHP?
解析数组编辑: table 测量的结构:
ID nodeID humidity temperature pressure voltage datetime
20519 Node1 46.66 21.39 1013.9 3.313 2017-05-20 10:54:00
20520 Node1 46.87 21.37 1013.9 3.321 2017-05-20 10:54:15
20521 Node1 46.55 21.35 1013.9 3.321 2017-05-20 10:54:30
20522 Node1 46.45 21.35 1013.8 3.321 2017-05-20 10:54:45
20523 Node1 46.68 21.35 1013.9 3.321 2017-05-20 10:55:00
20524 Node1 47.07 21.35 1013.8 3.314 2017-05-20 10:55:15
20525 Node1 47.41 21.36 1013.9 3.321 2017-05-20 10:55:30
20526 Node1 47.51 21.37 1013.9 3.314 2017-05-20 10:55:45
20527 Node1 47.53 21.36 1013.8 3.321 2017-05-20 10:56:00
20528 Node1 46.6 21.33 1013.9 3.321 2017-05-20 10:56:15
20529 Node1 47.14 21.33 1013.9 3.314 2017-05-20 10:56:30
20530 Node1 47.13 21.33 1013.9 3.313 2017-05-20 10:56:46
20531 Node1 48.22 21.36 1013.9 3.321 2017-05-20 10:57:01
20532 Node1 49.96 21.39 1013.9 3.321 2017-05-20 10:57:16
20533 Node1 49.49 21.43 1013.9 3.321 2017-05-20 10:57:31
20534 Node1 49.53 21.49 1014.0 3.321 2017-05-20 10:57:46
编辑 2 我写了一个 pythontool 来创建 sqlite 数据库:
import sqlite3
conn = sqlite3.connect('/var/www/sqliteDatabases/database_sdr.db') #connect to database "database.db"
cur = conn.cursor() #create a cursor
cur.execute('PRAGMA foreign_keys = ON') #enables the FOREIGN KEY constraint
#______create table for temperature and humidity with date and time______
cur.execute('''CREATE TABLE measurement(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
nodeId text,
humidity float,
temperature float,
pressure float,
voltage float,
datetime text)''')
conn.commit()
conn.close()
在下面的 SQLite 查询中,我们为每一行计算 period
,并使用它来对结果进行分组:
SELECT AVG(humidity) AS avgHumidity,
AVG(temperature) AS avgTemperate,
AVG(pressure) AS avgPressure,
AVG(voltage) AS avgVoltage,
round(100*(julianday(datetime)-julianday(:datetimestart))/
(julianday(:datetimeend)-julianday(:datetimestart))) AS period
FROM measurement
WHERE nodeId = :nodeId AND
datetime BETWEEN :datetimestart AND :datetimeend
GROUP BY period
所以基本上您需要对结果进行分组。几点说明:
- 我使用了
julianday()
函数来进行加减运算
除法,这可能不是在 SQLite3 中执行此操作的正确方法。 - 我多次重复使用
:datetimestart
和:datetimeend
。在 MySQL
这是不允许的。不知道在sqlite3中是否允许。如果它 不是简单地重命名它们:datetimeend1
、:datetimeend2
等 - 这只是一个未经测试的朝正确方向的推动。具体细节你自己想。