我遇到了以下问题。
给定一个基本上由两列组成的表,一个时间戳和一个值,我需要通过平均值,值和时间戳来减少时间戳到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具有限制和偏移量。
答案 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