2016-05-17 5 views
0

は、私は以下のように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-05-16 01:00:00.000および> 2016-05-16 00:00:00.000)からIPアドレスを一致させ、IPアドレスと期間Aとの差を返します。結果numfails結果MINUS期間b numfails result 。これは、期間Aのすべての一意のIPアドレス(すべてが一意です)が期間Bと比較されます。

このようなことを行う簡単な方法はありますか?レポートを毎日実行したいので、期間Aは今日の日付にシフトし、期間Bは前日の日付になります。私はそれを呼び出し元のSQLであらかじめ設定することができますが、私は2つの値を取得して差異を報告し、報告するために何を構築すべきかを知りません。

+1

上記のサンプルデータに必要な出力を投稿することができますか?ヘルプを高速化したり、アップフォートしたりする方法については、https://spaghettidba.com/2015/04/24/how-to-post-at-sql-question- on-a-public-forum/ – TheGameiswar

+0

を参照してください。http://stackoverflow.com/questions/634568/how-to-get-difference-between-two-rows-for-a-column-field –

+0

[**どのようにto-Ask **](http://stackoverflow.com/help/how-to-ask) \t \tここには、[** START **](http://spaghettidba.com/2015/04/24/how-to-post-at-sql-on-a-public-forum /)をご覧ください。 –

答えて

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 

必要に応じて日付を操作できます。

+0

すごく、ありがとう。 SQLを実際に使用して値を取得して操作する方法について、これまでより少し良く理解しています。 –