2016-12-22 2 views
0

Я строю приложение cake3, который собирает много данных временных рядов в таблице double_measures:Предельные/RESAMPLE данные в CakePhp3

select * from double_measures limit 20; 
+----+--------------------+---------------------+-------+--------+ 
| id | physical_sensor_id | time    | milis | value | 
+----+--------------------+---------------------+-------+--------+ 
| 1 |     1 | 2016-11-25 00:50:01 |  0 | 306.15 | 
| 2 |     2 | 2016-11-25 00:50:01 |  0 | 300.15 | 
| 3 |     3 | 2016-11-25 00:50:01 |  0 | 308.15 | 
| 4 |     4 | 2016-11-25 00:50:01 |  0 | 308.15 | 
| 5 |     6 | 2016-11-25 00:50:01 |  0 | 310.15 | 
| 6 |     7 | 2016-11-25 00:50:01 |  0 | 310.15 | 
| 7 |     8 | 2016-11-25 00:50:01 |  0 | 305.15 | 
| 8 |     9 | 2016-11-25 00:50:01 |  0 | 306.15 | 
| 9 |     10 | 2016-11-25 00:50:01 |  0 | 304.15 | 
| 10 |     11 | 2016-11-25 00:50:01 |  0 | 309.15 | 
| 11 |     1 | 2016-11-25 00:55:01 |  0 | 306.15 | 
| 12 |     2 | 2016-11-25 00:55:01 |  0 | 300.15 | 
| 13 |     3 | 2016-11-25 00:55:01 |  0 | 308.15 | 
| 14 |     4 | 2016-11-25 00:55:01 |  0 | 308.15 | 
| 15 |     6 | 2016-11-25 00:55:01 |  0 | 310.15 | 
| 16 |     7 | 2016-11-25 00:55:01 |  0 | 310.15 | 
| 17 |     8 | 2016-11-25 00:55:01 |  0 | 305.15 | 
| 18 |     9 | 2016-11-25 00:55:01 |  0 | 306.15 | 
| 19 |     10 | 2016-11-25 00:55:01 |  0 | 304.15 | 
| 20 |     11 | 2016-11-25 00:55:01 |  0 | 309.15 | 
+----+--------------------+---------------------+-------+--------+ 

В настоящее время я выбирающий значения в следующем запросе $measures = $table->find('all',['order'=>['id'=>'DESC']])->select(['time','milis','value'])->where(['physical_sensor_id'=>$sid])->limit($limit);, который возвращает последний $ limit для данного датчика.

Однако, я предпочел бы, чтобы равномерно повторно образец таблицы, чтобы получить каждый п-й величины, с п быть

[число значений для $ с.и.д.]/$ предел.

Благодаря How do you select every n-th row from mysql, я знаю, как это сделать в MySql, но есть ли способ сделать это в Cakephp3?

Конечно, я мог бы повторно опросить запрос AFTER, но это не вариант, так как у меня закончилась нехватка памяти для наборов результатов HUGE.

+0

Связанное решение использует вычисляемый столбец, добавляющий последовательную нумерацию к внутреннему запросу, а затем выбрав по модулю операцию на созданной виртуальной таблице. Есть ли способ добавить такой вычисленный столбец на уровне запроса (до того, как какие-либо данные действительно будут извлечены) в торте? Могу ли я просто создать представление и использовать этот вид? Как бы я это сделал, имея в виду, что я хочу выбрать физический_sensor_id? –

ответ

0

Найден решение:

в моем AppController я определил функцию следующим образом:

protected function initRowNumbering(){ 
    $conn = ConnectionManager::get('default'); 
    $conn->execute("SET @i = 0"); 
} 

Затем в контроллере, где мне нужно ресемплирование, у меня есть следующий:

 $query = $table->find('all',['order'=>['id'=>'DESC']])->select(['time','milis','value'])->where(['physical_sensor_id'=>$sid]); 

     if ($sample != null){ // if the number of samples is set: 
      $this->initRowNumbering(); // add index variable 
      $count = $query->count(); // count total number of values for given sensor 
      $step = (int)($count/$sample); // calculate sample step size 
      if ($step > 0){ 
       $measures = $query->where(['(@i := @i+1)%'.$step.'=0']); // add resampling filter 
      } else { 
       $measures = $query; 
      }        
     } else { 
      $measures = $query->limit($limit); 
     } 

Это хорошо работает, хотя это может быть не самое элегантное решение.

Любые идеи по улучшению?

Смежные вопросы