问题:
如何只计算间隔中每个持续时间(小间隔)的第一个值?
详细信息:
我有(很多)计数器(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)查询样本表关于持续时间(小时/天/周/月等)。并获取区间中每个持续时间的总计数。
例如,如果间隔为:2014年1月1日 - 2015年1月1日且持续时间为月份,则结果集将为12行,表示月份中的12个月和月份“i”的月份值将月[i + 1] .value - month [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)格式,因为我希望能够将groupBy和sum计数器按时间在不同的查询中,以便上面的示例获取:
| count | Time |
| 10 | 2015-06-12 14:00:00 |
| 33 | 2015-06-12 16:00:00 |
| 65 | 2015-06-12 18:00:00 |
我一直在这里寻找和有一个很好的例子来解决这个问题,但没有用我发现的东西解决它: Sql to select row from each day of a month
Select first row in each GROUP BY group?
When should I use Cross Apply over Inner Join?
谢谢!
答案 0 :(得分:0)
很久以前这个问题。无论如何,我以某种丑陋的方式解决了它。我为每个相关的持续时间(日/杂草/月等)创建了一个单独的表,持续时间表将FK保存到每个间隔原始数据的第一个报告 - 这样我就可以查询已知间隔并为其拉取原始值。