首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

怎么记算当前列与前一列的均值

2013-12-11 
如何记算当前列与前一列的均值?create table t (a int)insert into tselect 1union allselect 2union all

如何记算当前列与前一列的均值?



create table t (a int);
insert into t
select 1
union all
select 2
union all
select 3
union all
select 4;


目标结果:
a ,avg(Cn,Cn-1)
1 ,NULL
2,(2+1)/2
3,(3+2)/2
4,(4+3)/2

求当前列与前一列的均值,有什么好的办法,可以通过一条语句实现吗?

[解决办法]

create table #t (a INT,id int);
insert into #t
select 1,1
union all
select 2,2
union all
select 3,3
union all
select 4,4

SELECT a,'('+RTRIM(a)+'+'+RTRIM((SELECT a FROM #t WHERE id=t1.id-1))+')/2' [avg]
FROM #t t1

[解决办法]
create table t (a int);
insert into t
select 1
union all
select 2
union all
select 3
union all
select 4;

;with tt
as
(
select *,ROW_NUMBER() over(order by @@servername) ronum
from t
)

select t1.a,(t1.a + t2.a) /2 'avg(Cn,Cn-1)'
from tt t1
left join tt t2
       on t1.ronum = t2.ronum + 1
/*
aavg(Cn,Cn-1)
1NULL
21
32
43
*/    

[解决办法]
引用:
SQL server 2008


对了你的除法,是整数的除法吗,在sql server 里面(1)/2 是等于0的,如果是要等于0.5,得这样:
create table t (a int);
insert into t
select 1
union all
select 2
union all
select 3
union all
select 4;

;with tt
as
(
select *,ROW_NUMBER() over(order by @@servername) ronum
from t
)

select t1.a,(t1.a + t2.a) /2.0 'avg(Cn,Cn-1)'
from tt t1
left join tt t2
       on t1.ronum = t2.ronum + 1
/*
aavg(Cn,Cn-1)
1NULL
21.500000
32.500000
43.500000
*/   

[解决办法]


create table #tab (a INT,id int);
insert into #tab
select 1,1
union all
select 2,2
union all
select 3,3
union all
select 4,4


select a.a,'('+convert(varchar(20),a.id)+'+'+convert(varchar(20),
case when b.id-1=0 then null else b.id-1 end)+')/2' as [avg(Cn,Cn-1)] from #tab a
left join #tab b on a.id=b.id
a           avg(Cn,Cn-1)
----------- ---------------------------------------------
1           NULL
2           (2+1)/2
3           (3+2)/2
4           (4+3)/2

(4 行受影响)


[解决办法]

create table #tab (a INT,id int);
insert into #tab
select 1,1
union all
select 2,2
union all
select 3,3
union all
select 4,4


select a.a,(convert(numeric(18,2),a.id)+
case when b.id-1=0 then null else b.id-1 end )/2 as [avg(Cn,Cn-1)] from #tab a
left join #tab b on a.id=b.id

a           avg(Cn,Cn-1)
----------- ---------------------------------------
1           NULL
2           1.500000
3           2.500000
4           3.500000

(4 行受影响)

[解决办法]

create table #t (a int);
insert into #t


select 1
union all
select 2
union all
select 3
union all
select 4;

;with ceb as
(
select ROW_NUMBER() over(order by getdate()) as rn,* from #t 

select b.a,cast(((b.a+c.a)/2.0) as float) as 'avg(Cn,Cn-1)' from ceb b left join 
ceb c on b.rn=c.rn+1


[解决办法]
自连接 ,第二个输入要错位。就这思路。用函数的话,大数据应该速度不行  
你想想吧

热点排行