如何限制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
  • 这只是一个未经测试的朝正确方向的推动。具体细节你自己想。