TSQL:在范围之间插入数据的任何有效方法

时间:2014-04-02 05:46:06

标签: sql-server tsql

在我的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开销实现它吗?我只需要在基于输入参数的范围之间插入额外的计数器。

感谢您的意见。

3 个答案:

答案 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