随着时间的推移,同一个表中的值的增量 - SQL Server

时间:2016-05-17 14:13:44

标签: sql-server

我在SQL Server中有一个数据表:

+-------+------------+-------------------------+--------------------------+
|  ID   |       IP   |              Date       |                 NumFails |
+-------+------------+-------------------------+--------------------------+
| 21365 | 172.16.2.1 | 2016-05-16 00:20:54.000 |                      200 |
| 21457 | 172.16.3.1 | 2016-05-16 00:21:05.000 |                      295 |
| 21478 | 172.16.4.1 | 2016-05-16 00:22:46.000 |                      128 |
| 24255 | 172.16.2.1 | 2016-05-16 12:22:01.000 |                      213 |
| 24318 | 172.16.3.1 | 2016-05-16 12:22:12.000 |                      297 |
| 24366 | 172.16.4.1 | 2016-05-16 12:23:52.000 |                      243 |
| 25699 | 172.16.2.1 | 2016-05-16 18:21:31.000 |                      226 |
| 25794 | 172.16.3.1 | 2016-05-16 18:21:41.000 |                      347 |
| 25811 | 172.16.4.1 | 2016-05-16 18:22:51.000 |                      270 |
| 27142 | 172.16.2.1 | 2016-05-17 00:22:45.000 |                      227 |
| 27193 | 172.16.3.1 | 2016-05-17 00:22:55.000 |                      347 |
| 27251 | 172.16.4.1 | 2016-05-17 00:23:59.000 |                      270 |
+-------+------------+-------------------------+--------------------------+

我知道如何以编程方式执行此操作,但我不熟悉SQL以了解如何执行此操作:我希望在给定特定时间段内获取NumFails的增量。为此,我希望能够进行以下查询:

从时间段A(< 2016-05-17 01:00:00.000和> 2016-05-17 00:00:00.000)中选择IP地址,并从时间段B(< 2016-)中选择匹配的IP地址05-16 01:00:00.000和> 2016-05-16 00:00:00.000)并返回IP地址和与周期A不同的结果,结果为MINUS周期b numfails结果。这是针对时间段A中的每个唯一IP地址(都是唯一的)与时间段B进行比较而完成的。

任何简单的方法来做这样的事情?我想每天运行报告,因此期间A将转移到今天的日期,期间B将转移到前一天的日期。我可以使用调用SQL预先填充它,但我不知道要构建什么来获取两个值并执行差异并报告。

1 个答案:

答案 0 :(得分:0)

此解决方案假设每个IP都将存在于两个时间范围内。

declare @StartPeriodA datetime
declare @EndPeriodA datetime
declare @StartPeriodB datetime
declare @EndPeriodB datetime

set @StartPeriodA = '2016-05-17 00:00:00.000'
set @EndPeriodA = '2016-05-17 01:00:00.000'
set @StartPeriodB = '2016-05-16 00:00:00.000'
set @EndPeriodB = '2016-05-16 01:00:00.000'

select a.IP, a.PeriodAFailures - b.PeriodBFailures as 'FailureDifference'
from
(
    select IP, sum(NumFails) as PeriodAFailures
    from YourTable
    where Date between @StartPeriodA and @EndPeriodA
    group by IP
) a
inner join 
(
    select IP, sum(NumFails) as PeriodBFailures
    from YourTable
    where Date between @StartPeriodB and @EndPeriodB
    group by IP
) b on a.IP = b.IP

您可以根据需要操作日期。