Дневной световой интеграл от интенсивности света 20 с - PullRequest
0 голосов
/ 26 февраля 2020

Я записываю интенсивность света с интервалами 20 с как количество фотонов. Мне нужно интегрировать значения в течение дня. Дневной интеграл света предполагает, что интенсивность света измеряется каждую секунду. Простое выполнение SUM () для дневных записей и умножение результата на 20 сработало бы , если бы записи были точно на расстоянии 20 с , чего, к сожалению, нет.

Мне нужно умножить каждое чтение на разницу во времени между записью и предыдущей.

Я бы предпочел сделать это в SQL вместо того, чтобы извлекать записи по одному за раз программно .

Идеи приветствуются. [править] Просто посмотрел на некоторые реальные данные, и аппроксимация, сделанная, предполагая, что интервалы ровно 20 с, меньше, чем предположение, что выборка каждые 20 с может заменить выборку каждую секунду. Итак, я снял вопрос

1 Ответ

1 голос
/ 26 февраля 2020

Вот небольшой пример с таблицей из 3 столбцов (id, timestamp, cnt)

, тогда вы можете рассчитать его следующим образом:

SELECT p.id, p.mytime, p.photons, l.photons
,TIMESTAMPDIFF(SECOND, l.mytime, p.mytime) diffsecs
,p.photons * COALESCE(TIMESTAMPDIFF(SECOND, l.mytime, p.mytime),1) as cnt
FROM photons p
LEFT JOIN photons l ON p.id -1 = l.id
ORDER BY p.id;

SELECT SUM( p.photons * COALESCE(TIMESTAMPDIFF(SECOND, l.mytime, p.mytime),1)) as cnt
FROM photons p
LEFT JOIN photons l ON p.id -1 = l.id
ORDER BY p.id;

sample

mysql> describe photons;
+---------+------------------+------+-----+---------+----------------+
| Field   | Type             | Null | Key | Default | Extra          |
+---------+------------------+------+-----+---------+----------------+
| id      | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| mytime  | timestamp        | YES  | MUL | NULL    |                |
| photons | int(11)          | YES  |     | NULL    |                |
+---------+------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> select * from photons;
+----+---------------------+---------+
| id | mytime              | photons |
+----+---------------------+---------+
|  1 | 2020-02-26 12:00:00 |     100 |
|  2 | 2020-02-26 12:00:25 |      80 |
|  3 | 2020-02-26 12:01:00 |     100 |
|  4 | 2020-02-26 12:05:00 |     200 |
|  5 | 2020-02-26 12:05:03 |      22 |
+----+---------------------+---------+
5 rows in set (0.00 sec)

mysql> SELECT p.id, p.mytime, p.photons, l.photons
    -> ,TIMESTAMPDIFF(SECOND, l.mytime, p.mytime) diffsecs
    -> ,p.photons * COALESCE(TIMESTAMPDIFF(SECOND, l.mytime, p.mytime),1) as cnt
    -> FROM photons p
    -> LEFT JOIN photons l ON p.id -1 = l.id
    -> ORDER BY p.id;
+----+---------------------+---------+---------+----------+-------+
| id | mytime              | photons | photons | diffsecs | cnt   |
+----+---------------------+---------+---------+----------+-------+
|  1 | 2020-02-26 12:00:00 |     100 |    NULL |     NULL |   100 |
|  2 | 2020-02-26 12:00:25 |      80 |     100 |       25 |  2000 |
|  3 | 2020-02-26 12:01:00 |     100 |      80 |       35 |  3500 |
|  4 | 2020-02-26 12:05:00 |     200 |     100 |      240 | 48000 |
|  5 | 2020-02-26 12:05:03 |      22 |     200 |        3 |    66 |
+----+---------------------+---------+---------+----------+-------+
5 rows in set (0.00 sec)

mysql> SELECT SUM( p.photons * COALESCE(TIMESTAMPDIFF(SECOND, l.mytime, p.mytime),1)) as cnt
    -> FROM photons p
    -> LEFT JOIN photons l ON p.id -1 = l.id
    -> ORDER BY p.id;
+-------+
| cnt   |
+-------+
| 53666 |
+-------+
1 row in set (0.00 sec)

mysql> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...