2016-10-01 43 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 
相關問題