将行拆分为m个部分并构建每个部分的平均值[SQLite]

时间:2016-10-01 18:24:51

标签: sql 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

我知道如何通过包含WHERE来删除不需要的行,如何对给定的行集进行平均,但不能想办法如何将所需数据集拆分为m个部分。

感谢任何帮助和想法!

我使用的SQLite不会让这更容易,并且不能令人遗憾地切换到任何其他方言。

我尝试根据行数和行数对行进行分组,但没有成功。我想到的唯一其他解决方案是获取受影响行的计数,UNION m SELECTs具有限制和偏移量。

1 个答案:

答案 0 :(得分: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