我正在使用SQL Server 2008,我跟随表有数百万行......以下是一些示例记录
Serial_Num ReadingDate M_Counter Dyn_Counter
XYZ 3/15/2014 100 190
XYZ 4/18/2014 140 240
XYZ 5/18/2014 200 380
ABC 3/12/2014 45 40
ABC 4/19/2014 120 110
ABC 5/21/2014 130 155
这个表每个月只有一个读数,没有错过的月份......
我想计算每个月的M_Counter和Dyn_Counter值,例如XYZ - > 5月计算的计数器值应为60 = 200(2014年5月18日值) - 140(2014年4月18日值)。我想以下列方式将数据插入另一个表中。
CalculatedYear CalculatedMonth Serial_Num M_Counter_Calc Dyn_Counter_Calc
2014 4 XYZ 40 50
2014 5 XYZ 60 140
2014 4 ABC 75 70
2014 5 ABC 10 45
任何帮助真的很感激!
答案 0 :(得分:0)
如果您正在使用MS SQL,那么这样的事情应该有效。该概念是基于Serial_Num和ReadingDate对数据集进行排序。添加顺序行ID并存储到临时表中。将表连接到自身,以便将当前行与序列号仍匹配的上一行匹配。如果没有前一个月的读数,则该值将为空。我们在进行计算时使用Isnull(x,0)来解释这一点。
declare @Temp1 table
(
RowID int,
Serial_Num varchar(3),
ReadingDate datetime,
M_Counter int,
Dyn_Counter int
)
insert into @Temp1
select ROW_NUMBER() over (order by Serial_Num, ReadingDate), *
from MyTable T
select
Year(T1.ReadingDate) As CalculatedYear,
Month(T1.ReadingDate) as CalculatedMonth,
T1.Serial_Num,
T1.M_Counter - ISNULL(T2.M_Counter,0) as Calculated_M_Counter,
T1.Dyn_Counter - isnull(T2.Dyn_Counter,0) as Calculated_Dyn_Counter
from @Temp1 T1
left outer join @Temp1 T2 on T1.RowID = T2.RowID + 1 and T1.Serial_Num = T2.Serial_Num
order by T1.Serial_Num, Year(T1.ReadingDate), Month(T1.ReadingDate)