2014-11-05 12 views
0

У меня возникла проблема с созданием SQL-запроса.Значения различий SQL Server между двумя строками в каждом месяце

Цель этого приложения - сделать разницу между двумя значениями, определенными первым из каждого месяца.

Вот запрос, который я построил:

SELECT 
    Date, 
    Compteur - (SELECT MAX(Compteur) 
       FROM SnmpDataPages 
       WHERE IP = t1.ip AND (Date < t1.Date) AND Compteur IS NOT NULL) AS diff, 
    IP 
FROM 
    SnmpDataPages AS t1 
WHERE 
    Compteur IS NOT NULL 
    AND Date BETWEEN dateadd(YEAR, -1, CAST(getdate() AS DATE)) AND CAST(getdate() AS DATE) 
ORDER BY 
    Date, diff DESC 

Это возвращает этот вывод:

Date  Diff IP 
--------------------------------- 
2014-11-04 5075 149.0.15.40 
2014-11-04 1623 149.0.19.177 
2014-11-04 1264 149.0.19.77 
etc. 

Этот запрос работает правильно для «ежедневно» различия, но не для ежемесячных различий .. (Я ищу, чтобы разделить 1-ю запись каждый месяц ..) и группировка подзапроса представляется невозможной ...

Таблица SnmpDataPage увеличивается каждый день с помощью ip каждого в ipheril в Парк и есть счетчик (общее количество страниц)

Пример:

id  IP   Counter Date  Model 
----------------------------------------------- 
28780 100.0.15.51 140064 2014-10-08 Lexmark 
28781 100.0.15.53 243617 2014-10-08 Lexmark 
28782 100.0.15.55 24101 2014-10-08 Samsung 
28783 100.0.15.56 135907 2014-10-08 Brother 

44000 100.0.15.51 200000 2014-11-08 Lexmark 
44001 100.0.15.53 250000 2014-11-08 Lexmark 
44002 100.0.15.55 24200 2014-11-08 Samsung 
44003 100.0.15.56 230000 2014-11-08 Brother 

Выход, как мне это нужно: (Счетчик (М (М-1)))

date   diff  IP 
----------------------------------- 
2014-11-08 59936  100.0.15.51 
2014-11-08 6383  100.0.15.53 
etc. 
+0

Пожалуйста, отредактируйте ваш вопрос и укажите некоторые данные образца как а также желаемые результаты. –

ответ

0

Передразнивало вверх данные

create table #SnmpDataPage (id int, IPaddress varchar(50), TheCounter int, TheDate datetime, Model varchar(50)) 

insert into #SnmpDataPage values (28780, '100.0.15.51', 140064, '2014-10-08', 'Lexmark') 
insert into #SnmpDataPage values (28781, '100.0.15.53', 243617, '2014-10-08', 'Lexmark') 
insert into #SnmpDataPage values (28782, '100.0.15.55', 24101, '2014-10-08', 'Samsung') 
insert into #SnmpDataPage values (28783, '100.0.15.56', 135907, '2014-10-08', 'Brother') 

insert into #SnmpDataPage values (44000, '100.0.15.51', 200000, '2014-11-08', 'Lexmark') 
insert into #SnmpDataPage values (44001, '100.0.15.53', 250000, '2014-11-08', 'Lexmark') 
insert into #SnmpDataPage values (44002, '100.0.15.55', 24200, '2014-11-08', 'Samsung') 
insert into #SnmpDataPage values (44003, '100.0.15.56', 230000, '2014-11-08', 'Brother') 

запрос, чтобы сделать диф в прошлом месяце

select #SnmpDataPage.TheDate, #SnmpDataPage.IPaddress, #SnmpDataPage.Model, 
     #SnmpDataPage.TheCounter - Allrecords.TheCounter as TheDifference 
from #SnmpDataPage 
    join ( select TheDate, TheCounter, IPAddress 
      from #SnmpDataPage 
     ) Allrecords 
      on #SnmpDataPage.IPaddress = AllRecords.IPaddress 
      and datediff(month, #SnmpDataPage.TheDate, AllRecords.TheDate) = -1 

Результаты

TheDate  IPaddress  Model TheDifference 
2014-11-08 100.0.15.51 Lexmark  59936 
2014-11-08 100.0.15.53 Lexmark  6383 
2014-11-08 100.0.15.55 Samsung  99 
2014-11-08 100.0.15.56 Brother  94093 

Это может быть расширено, чтобы добавить и предыдущие месяцы. Если я добавлю следующие тестовые данные, он вернет 8 строк в результатах, показывая разницу между 10-08 и 09-08 в первых 4 строках:

insert into #SnmpDataPage values (18780, '100.0.15.51', 40064, '2014-09-08', 'Lexmark') 
insert into #SnmpDataPage values (18781, '100.0.15.53', 43617, '2014-09-08', 'Lexmark') 
insert into #SnmpDataPage values (18782, '100.0.15.55', 4101, '2014-09-08', 'Samsung') 
insert into #SnmpDataPage values (18783, '100.0.15.56', 35907, '2014-09-08', 'Brother') 
+0

Действительно спасибо, ты спас мой день, это то, что я ищу :) – user2798773

0

Попробуйте это и дайте мне знать.

CREATE TABLE #tmp 
    (
     ID INT, 
     IP varchar(50), 
     [counter] INT, 
     date DATETIME, 
     model VARCHAR(500) 
    ) 

    INSERT INTO #tmp  (ID, IP, counter, date, model) VALUES (1,'100.0.10.11',140064,'2014-10-08','Lexmark') 
    INSERT INTO #tmp  (ID, IP, counter, date, model) VALUES (1,'100.0.10.11',200000,'2014-10-08','Lexmark') 


    SELECT * FROM #tmp 

    SELECT IP,MONTH(date),MAX([counter])-MIN([counter]),model FROM #tmp 
GROUP BY IP,MONTH(date),model