SQL中每一行的数据和上一行的数据进行计算
在做一些对比的报表查询是有些情况下需要计算出这个报表中的每一行数据的对比,
比如每周的小计和上周对比,
这个时候就需要对读取每一行的数据进行计算,如果在程序中读取数据然后使用程序脚本进行计算的话是很容易的,
但是如果是必须使用纯SQL语句写的话,大多数人都会想到使用游标,
可是游标的效率却又让人不敢恭维,
这个时候可以这样写
有表A
数据如下
a1 a2
1 2
1 3
1 4
如果需要拿第一行和第二行对比,第三和第二行对比,
可以使用row_number()添加两个临时表如
select ROW_NUMBER() over(order by a1) as id,* into #tmp1 from A
select (ROW_NUMBER() over(order by a1)+1) as id,* into #tmp2 from A
注意 其中第二个临时表的ID是加1的 ROW_NUMBER() over(order by a1)+1
结果就有两个临时表,则数据是
#tmp1
ID a1 a2
1 1 2
2 1 3
3 1 4
#tmp2
ID a1 a2
2 1 2
3 1 3
4 1 4
这个时候如果是用左连接 就可以实现对比了
语法如
select a.a1/b.a2 as a1, a.a2 / b.a2 as a2 into #tmp3
from #tmp1 as a left join #tmp2 as b on a.id = b.id
这样子就能实现每一行的数据的对比
这个方法的思路其实就是使用row_number 将每一行数据进行一个错开,
然后使用左连接对应起来获取到对应的行而进行计算,
效率的话 我没去测试过,不知道比起游标怎么样,
如果有谁有去测试过的话可以告诉我