【问题标题】:SQL server - Calculate delta per durationSQL server - 计算每个持续时间的增量
【发布时间】: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


    【解决方案1】:

    这个问题很久以前了。无论如何,我以一种丑陋的方式解决了它。我为每个相关的持续时间(天/杂草/月等)创建了一个单独的表,并且持续时间表将 FK 保存到每个间隔原始数据的第一个报告中——这样我可以查询已知间隔并为其提取原始值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 2020-05-05
      • 2019-08-12
      • 2013-08-14
      • 1970-01-01
      相关资源
      最近更新 更多