在我的SQL Server数据库中,我有一个这样的表:
counter, value
12345, 10.1
12370, 10.5
12390, 9.7
12405, 10.1
12510, 12.3
假设我输入的值为5.我需要在计数器列中以5为增量填写第一条记录和第二条记录之间的数据。
例如,使用Record 1和Record 2,以下是需要插入表中的附加数据。
12345, 10.1 --> Record 1
12350, 10.1
12355, 10.1
12360, 10.1
12365, 10.1
12370, 10.5 --> Record 2
除了使用数据库游标循环遍历表中的每个记录,然后在Record 1之后选择MIN计数器,还有其他方法可以用较少的I / O开销实现它吗?我只需要在基于输入参数的范围之间插入额外的计数器。
感谢您的意见。
答案 0 :(得分:0)
如果您想计算加权平均值,则无需创建这些行。您可以计算出 添加的行数,并使用该信息计算平均值。 E.g:
declare @t table (counter int not null, value decimal(19,4) not null)
insert into @t(counter, value) values
(12345, 10.1),
(12370, 10.5),
(12390, 9.7 ),
(12405, 10.1),
(12510, 12.3)
declare @gap int
set @gap = 5
;With Numbered as (
select counter,value,ROW_NUMBER() OVER (ORDER BY counter) as rn
from @t
), Paired as (
select n1.counter,n1.value,
(n2.counter - n1.counter)/@gap as Cnt --What do we do for the last row?
from Numbered n1
left join
Numbered n2
on
n1.rn = n2.rn - 1
)
select SUM(value*COALESCE(Cnt,1))/SUM(COALESCE(Cnt,1)) from Paired
你可以(希望)看到,我目前已经确定最后一行只计为1,但其他任何也可以在那里完成。
答案 1 :(得分:0)
递归也应该起作用:
;WITH
Initial AS (SELECT COUNTER,value FROM yourtable),
maxvalue AS (SELECT MAX(COUNTER) Mvalue FROM Initial),
recur AS (
SELECT COUNTER, value FROM yourtable
UNION ALL
SELECT counter+5,value FROM recur r WHERE COUNTER+5< (SELECT Mvalue FROM maxvalue)
AND NOT EXISTS (SELECT 1 FROM Initial o WHERE o.COUNTER=r.COUNTER+5)
)
SELECT * FROM recur ORDER BY COUNTER
只需将'yourtable'替换为您的表名
答案 2 :(得分:0)
使用Numbers
表(一个包含单个int列的表,其中包含从1到足够大的数字的数字)来填充带有值的间隙通常是最好的问题:
declare @n1 int = 12345, @n2 int = 12370, @step int = 5
select @n1 + (n * @step)
from numbers
where n < (@n2 - @n1) / @step