2014-11-05 31 views
0

我在创建SQL查询时遇到了问题。每月2行之间的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. 

这个请求正常工作的“日报”的差异,而不是每月的差异。(我搜索差异第一个记录关闭每个月..)和分组子查询似乎不可能...

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 

输出作为予需要它:(计数器(M-(M-1)))

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

请编辑您的问题并提供一些示例数据以及期望的结果。 – 2014-11-05 16:09:20

回答

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') 

查询做一个diff上月

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行,显示前4行中10-08和09-08之间的差异:

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 2014-11-06 13:26:37

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