SQL中每一行的数据和上一行的数据进行计算

来源:互联网 发布:网站访问量统计js插件 编辑:程序博客网 时间:2024/05/18 01:41

在做一些对比的报表查询是有些情况下需要计算出这个报表中的每一行数据的对比,

比如每周的小计和上周对比,

这个时候就需要对读取每一行的数据进行计算,如果在程序中读取数据然后使用程序脚本进行计算的话是很容易的,

但是如果是必须使用纯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 将每一行数据进行一个错开,

然后使用左连接对应起来获取到对应的行而进行计算.

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 营业执照异常名录移除注销怎么办 工商局注册后骚扰电话怎么办 单位工作失误医保断交7年怎么办 大门对大门怎么办?巧用天官赐福 委托书公司名称打错了怎么办 招行ubank不对账怎么办 信贷公司利息高不合理怎么办 衣服上的logo掉怎么办 ui设计师接不到私活怎么办 微信打开很慢怎么办 小泰迪感冒加身上结痂怎么办 法斗眼睛肿了怎么办 地图鱼身上有白点怎么办 人被广告牌砸了怎么办 小米手机出现繁体中文英文怎么办 雅思考试把姓名写错了怎么办 房贷的流水账假怎么办 报到证报道期限过期了怎么办 注销公司公章丢了怎么办 家里的猫太调皮怎么办 孩子纹身了我该怎么办 46天婴儿感冒了怎么办 狗病了不吃东西怎么办 幼儿急诊见风了怎么办 哺乳期乳房有硬块而且疼怎么办 哺乳期乳头破裂乳房似针扎怎么办 回奶胀痛的厉害怎么办 淡水龟的壳变软了怎么办 棕色的泰迪变白怎么办 大班教案泥石流来了怎么办 鸟类的嘴巴坏了怎么办 四川麦蚊子咬了怎么办 脸上被晒脱皮了怎么办 额头被晒脱皮了怎么办 脸黑一块白一块怎么办 小乌龟的壳软了怎么办 把田螺后面吃了怎么办 微生物生态菌群异常怎么办 怀孕初期感染了动物病毒怎么办? 金龙和银龙打架怎么办 海水缸盐度高了怎么办