SQL-сервер - вычислить дельту за продолжительность

Вопрос:

Как я могу рассчитать только первые значения для каждой продолжительности (небольшого интервала) в интервале?

Подробности:

У меня есть (много) счетчиков (столбец counterId). время от времени производится выборка каждого счетчика, и эта выборка сохраняется в таблице counter_samples:

таблица counter_samples:

id |counterId  | value  | Time                |
1  | 1         | 100    | 2015-06-12 14:00:04 |
2  | 2         | 57     | 2015-06-12 14:00:11 |
3  | 1         | 100    | 2015-06-12 15:00:43 |
4  | 2         | 59     | 2015-06-12 15:00:24 |
5  | 1         | 104    | 2015-06-12 16:00:12 |
6  | 2         | 63     | 2015-06-12 16:00:14 |
7  | 1         | 110    | 2015-06-12 17:00:25 |
8  | 2         | 70     | 2015-06-12 17:00:28 |
9  | 1         | 120    | 2015-06-12 18:00:17 |
10 | 2         | 80     | 2015-06-12 18:00:36 |
11 | 1         | 130    | 2015-06-12 19:00:04 |
12 | 2         | 90     | 2015-06-12 19:00:13 |
13 | 1         | 170    | 2015-06-12 20:00:52 |
14 | 2         | 95     | 2015-06-12 20:00:13 |
15 | 1         | 190    | 2015-06-12 21:00:11 |
16 | 2         | 99     | 2015-06-12 21:00:04 |

Как видите, по прошествии времени каждое значение счетчика всегда больше или равно предыдущему значению (равно = нет подсчета в промежутке времени)

Я хочу для любого заданного интервала (@start_date И @end_date) запросить таблицу образцов о продолжительности (час / день / неделя / месяц и т. Д.) И получить общий подсчет для каждой продолжительности в интервале.

Например, если интервал: 01.01.2014 - 01.01.2015, а продолжительность - месяц, набор результатов будет состоять из 12 строк, которые представляют 12 месяцев в интервале, а значение месяца для месяца 'i' будет < strong> month [i + 1] .value - месяц [i] .value.

Чтобы вычислить подсчет, я хочу вычесть первую запись следующей продолжительности из первой записи текущей продолжительности - в приведенном выше примере, если продолжительность составляет 2 часа, то я хочу получить (для counterId = 1):

 |CounterId  | count  | Time                |
 | 1         | 4      | 2015-06-12 14:00:00 |
 | 1         | 16     | 2015-06-12 16:00:00 |
 | 1         | 50     | 2015-06-12 18:00:00 |

И для counterId = 2:

|CounterId  | count  | Time                |
| 2         | 6      | 2015-06-12 14:00:00 |
| 2         | 17     | 2015-06-12 16:00:00 |
| 2         | 15     | 2015-06-12 18:00:00 |

(обратите внимание, что в двух запросах выше время 20:00:00 игнорируется, поскольку для 22:00:00 и выше нет записи)

Время необходимо изменить, чтобы оно соответствовало формату (intervalStart + duration * k), потому что я хочу иметь возможность группировать по времени и суммировать счетчики по времени в другом запросе, чтобы в приведенном выше примере получить:

| count  | Time                |
| 10     | 2015-06-12 14:00:00 |
| 33     | 2015-06-12 16:00:00 |
| 65     | 2015-06-12 18:00:00 |

Я искал здесь и там хороший пример для этой проблемы, но не решил ее с помощью того, что нашел: Sql для выбора строки каждого дня месяца

Выбрать первую строку в каждой группе GROUP BY?

Когда следует использовать перекрестное применение через внутреннее объединение?

Спасибо!


person yossico    schedule 18.06.2015    source источник


Ответы (1)


Этот вопрос был давно. в любом случае, я решил это некрасиво. Я создал отдельную таблицу для каждой соответствующей продолжительности (день / трава / месяц и т. Д.), И таблица продолжительности содержит FK для первого отчета по каждому интервалу необработанных данных - таким образом я могу запрашивать известные интервалы и извлекать для них необработанные значения.

person yossico    schedule 03.12.2015