【发布时间】:2015-06-18 11:12:47
【问题描述】:
问题:
如何仅使用间隔中每个持续时间(小间隔)的第一个值进行计算?
详情:
我有(很多)计数器(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 |
如您所见,随着时间的推移,每个计数器的值总是大于或等于之前的值(等于=在时间跨度内不计数)
我想要的是对于任何给定的 interval (@start_date AND @end_date) 来查询有关 duration (小时/天/周/月等) 的示例表。 ) 并获取 interval 中每个 duration 的总计数。
例如,如果时间间隔是:1/1/2014 - 1/1/2015 并且持续时间是月份,则结果集将是 12 行,表示时间间隔中的第 12 个月和月份“i”的月份值将是 month[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) 格式,因为我希望能够在不同的查询中按时间对计数器进行分组和求和,以便上面的示例获得:
| 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?
谢谢!
【问题讨论】:
标签: sql sql-server timespan