2016-10-01 40 views
0

我遇到了以下问题。将行拆分为m个部分并构建每个部分的平均值[SQLite]

鉴于基本上由两列,时间戳和的值的表,我需要通过平均这两者的值和时间戳,以减少下降到m个数据行时间戳之间n行。

比方说,我希望在时间15和85之间的所有数据在最多3个数据行中。

time | value 
10 | 7 
20 | 6 
30 | 2 
40 | 9 
50 | 4 
60 | 3 
70 | 2 
80 | 9 
90 | 2 

Remove unneeded rows and split them into 3 parts 

20 | 6 
30 | 2 

40 | 9 
50 | 4 
60 | 3 

70 | 2 
80 | 9 

Average them 

25 | 4 
50 | 8 
75 | 5.5 

我知道如何通过包括在哪里,如何以平均一组给定的行,但也想不出如何想要的数据集分成M个部分的方式来删除不需要的行。

任何帮助和想法赞赏!

我使用SQLite不作任何这更容易,不能切换到任何其他方言黯然。

我试图根据行号和行数计算没有成功的行。我唯一想到的另一个解决方案是获取受影响的行数和UNION m个具有限制和偏移量的SELECT。

回答

0

我有它的工作。我的问题是我偶然做了整数除法。

我用组项目的计算公式为:

group = floor (row_number/(row_count/limit)) 

完整的SQL查询看起来是这样的:

SELECT 
    avg(measurement_timestamp) AS measurement_timestamp, 
    avg(measurement_value) AS average 
FROM (
    SELECT 
      (SELECT COUNT(*) 
       FROM measurements_table 
        WHERE measurement_timestamp > start_time AND measurement_timestamp < end_time) 
      AS row_count, 

      (SELECT COUNT(0) 
       FROM measurements_table t1 
        WHERE t1.measurement_timestamp < t2.measurement_timestamp 
        AND t1.measurement_timestamp > start_time AND t1.measurement_timestamp < end_time 
        ORDER BY measurement_timestamp ASC) 
      AS row_number, 

      * 
      FROM measurements_table t2 
      WHERE t2.measurement_timestamp > start_time AND t2.measurement_timestamp < end_time 
      ORDER BY measurement_timestamp ASC) 
GROUP BY CAST((row_number/(row_count/?)) AS INT) 

* the limit has to be a float 
相关问题