SQL 服务器 - 计算每个持续时间的增量
SQL server - Calculate delta per duration
问题:
如何仅使用区间中每个持续时间(小区间)的第一个值进行计算?
详情:
我有(很多)计数器(counterId 列)。
每个计数器不时采样,采样存储在"counter_samples" table:
counter_samples table:
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) 查询样本 table 关于 duration(hour/day/week/month 等等)并获取 interval 中每个 duration 的总计数.
例如,如果时间间隔为:1/1/2014 - 1/1/2015 并且持续时间为月,则结果集将有 12 行,代表时间间隔中的第 12 个月和月份的月份值 'i' 将是 月[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) 格式,因为我希望能够在不同的查询中按时间对 groupBy 和计数器求和,因此上面的例子得到:
| 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?
谢谢!
这个问题很久以前了。无论如何,我以一种丑陋的方式解决了它。我为每个相关持续时间(day/weed/month 等)创建了一个单独的 table 并且持续时间 table 将 FK 保存到每个间隔原始数据的第一个报告 - 这样我可以查询已知间隔并为其提取原始值。
问题:
如何仅使用区间中每个持续时间(小区间)的第一个值进行计算?
详情:
我有(很多)计数器(counterId 列)。 每个计数器不时采样,采样存储在"counter_samples" table:
counter_samples table:
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) 查询样本 table 关于 duration(hour/day/week/month 等等)并获取 interval 中每个 duration 的总计数.
例如,如果时间间隔为:1/1/2014 - 1/1/2015 并且持续时间为月,则结果集将有 12 行,代表时间间隔中的第 12 个月和月份的月份值 'i' 将是 月[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) 格式,因为我希望能够在不同的查询中按时间对 groupBy 和计数器求和,因此上面的例子得到:
| 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?
谢谢!
这个问题很久以前了。无论如何,我以一种丑陋的方式解决了它。我为每个相关持续时间(day/weed/month 等)创建了一个单独的 table 并且持续时间 table 将 FK 保存到每个间隔原始数据的第一个报告 - 这样我可以查询已知间隔并为其提取原始值。