• 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 将每一行数据进行一个错开,

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

    效率的话 我没去测试过,不知道比起游标怎么样,

    如果有谁有去测试过的话可以告诉我

  • 相关阅读:
    Linux Xshell常用命令(项目部署)
    返回的数据转换成百分比分的方法
    百度分享插件
    vue请求中 post get传参方式是不同的哦
    Axios 中文使用
    关于iview ui的"Page分页"组件的使用
    Vue 实现前进刷新,后退不刷新的效果
    Vue框架Element UI教程-axios请求数据
    Spring学习总结(8)-接口多个实现类的动态调用
    Redis集群
  • 原文地址:https://www.cnblogs.com/yellowapplemylove/p/2075244.html
Copyright © 2020-2023  润新知