2016-05-17 11 views
0

У меня есть таблица данных, как показано ниже в SQL Server:Delta значений в одной таблице с течением времени - 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 давала определенный период времени. Для этого я хочу, чтобы у меня был запрос:

Выбирает IP-адрес из периода времени 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-адрес и разницу между периодом. Результат numfails. Период MINUS. b numfails result. , Это делается для каждого уникального IP-адреса за период времени A (все являются уникальными) по сравнению с периодом времени B.

Любой простой способ сделать такое? Я хочу ежедневно запускать отчет, поэтому период А переместится на сегодняшнюю дату, а период В будет на день предыдущего дня. Я могу предварительно заполнить это с помощью вызывающего SQL, но я понятия не имею, что построить, чтобы захватить эти два значения и сделать разницу и сообщить.

+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-question-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 может быть использован для захвата и управления значениями. –

Смежные вопросы