如何限制SQL结果并采取平均值?

时间:2017-05-20 09:43:01

标签: php sql arrays limit average

我使用此SQL查询选择特定无线传感器节点的所有值,以根据时间戳绘制图表。

SELECT * FROM measurement 
        WHERE nodeId = :nodeId 
        AND datetime BETWEEN :datetimestart 
        AND :datetimeend

查询的数据通过AJAX发送给客户。如果在较长范围内选择时间戳,则阵列变大并且数据传输需要很长时间。如果阵列受到100个限制的限制会好得多。仅将查询限制为100并不能解决问题。

我需要做的是选择时间戳的整行并取100个不同内部时间戳的平均值。内部时间戳应该是动态的,取决于外部时间戳。

我不确定如何解决这个问题。是否可以根据SQL查询的时间戳选择100个平均数据?或者我需要用PHP解析数组吗?

修改 表测量结构:

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()

1 个答案:

答案 0 :(得分:1)

在以下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等。
  • 这只是一个未经测试的正确方向。您需要自己制定详细信息。