某个字段,怎么用该字段的上一行的数据减去下一行数据?

时间:2022-01-24 13:27:19
准确来说,我要从某张表中取某个字段,通过这个字段的上一行减去下一行得到的值生成新的表。

举例来说:

id        percent
------------------------------------
1         20
1         30
1         50
2         20
2         20
2         20
2         20

我需要查询出来的结果如下(注意:不需要保存结果,仅仅只是select查询出来):

id         percent
------------------------------------------
1          80
1          50
1          0
2          80
2          60
2          40
2          20

也就是说,在同一个ID下需要用固定值100去减第一行的20得到的80生成第一笔,然后用这个80去减第二行的30得到50生成第二笔,再用50减去第三行的50得到0生成第三笔,以此类推。

9 个解决方案

#1


sum(percent) over(partition by name over id)

#2



--1.创建测试表
create table tmp as
select 1 id, 20 percent from dual union all
select 1 id, 30 percent from dual union all
select 1 id, 50 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual;
--2.SQL实现
select id,100-sum(percent)over(partition by id order by rownum) percent
   from tmp;
 

#3


经过测试,上述SQL完全满足你的要求,而且性能很高。

#4


通过这个字段的上一行减去下一行得到的值生成新的表。  老生长谈的问题 你要给出上一行和下一行 你就得给出排序规则 

楼上的 partition by id order by rownum   哪怕你数据插入的再完美 根据rownum排序oracle并不能保证你一定能得到想要的结果

引用 2 楼 qq646748739 的回复:

--1.创建测试表
create table tmp as
select 1 id, 20 percent from dual union all
select 1 id, 30 percent from dual union all
select 1 id, 50 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual;
--2.SQL实现
select id,100-sum(percent)over(partition by id order by rownum) percent
   from tmp;
 



"通过这个字段的上一行减去下一行得到的值生成新的表"  老生长谈的问题 你要给出上一行和下一行 你就得给出排序规则 

这个 partition by id order by rownum   哪怕你数据插入的再完美 根据rownum排序oracle并不能保证你一定能得到想要的结果

#5


引用 4 楼 weixin_38847048 的回复:
通过这个字段的上一行减去下一行得到的值生成新的表。  老生长谈的问题 你要给出上一行和下一行 你就得给出排序规则 

楼上的 partition by id order by rownum   哪怕你数据插入的再完美 根据rownum排序oracle并不能保证你一定能得到想要的结果

Quote: 引用 2 楼 qq646748739 的回复:


--1.创建测试表
create table tmp as
select 1 id, 20 percent from dual union all
select 1 id, 30 percent from dual union all
select 1 id, 50 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual;
--2.SQL实现
select id,100-sum(percent)over(partition by id order by rownum) percent
   from tmp;
 



"通过这个字段的上一行减去下一行得到的值生成新的表"  老生长谈的问题 你要给出上一行和下一行 你就得给出排序规则 

这个 partition by id order by rownum   哪怕你数据插入的再完美 根据rownum排序oracle并不能保证你一定能得到想要的结果

 partition by id order by rownum  至少可以得到楼主想要的数据
哪怕数据是以任意顺序插入的,都可以得到。

#6


最不济的一种情况,最终结果再加个order by id, percent 排序也搞定了。

#7


引用 4 楼 weixin_38847048 的回复:
通过这个字段的上一行减去下一行得到的值生成新的表。  老生长谈的问题 你要给出上一行和下一行 你就得给出排序规则 

楼上的 partition by id order by rownum   哪怕你数据插入的再完美 根据rownum排序oracle并不能保证你一定能得到想要的结果

Quote: 引用 2 楼 qq646748739 的回复:


--1.创建测试表
create table tmp as
select 1 id, 20 percent from dual union all
select 1 id, 30 percent from dual union all
select 1 id, 50 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual;
--2.SQL实现
select id,100-sum(percent)over(partition by id order by rownum) percent
   from tmp;
 



"通过这个字段的上一行减去下一行得到的值生成新的表"  老生长谈的问题 你要给出上一行和下一行 你就得给出排序规则 

这个 partition by id order by rownum   哪怕你数据插入的再完美 根据rownum排序oracle并不能保证你一定能得到想要的结果


确实是个老生长谈的问题,之前网上搜了很多但都不是我想要的答案。其实上一行与下一行的排序规则在我的实际项目中还是以时间来排序的,不过为了简化问题描述省略了。不过现在我倒是可以尝试用时间字段代替rownum了,哈哈。谢谢提点!!!

#8


引用 2 楼 qq646748739 的回复:

--1.创建测试表
create table tmp as
select 1 id, 20 percent from dual union all
select 1 id, 30 percent from dual union all
select 1 id, 50 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual;
--2.SQL实现
select id,100-sum(percent)over(partition by id order by rownum) percent
   from tmp;
 


跪谢,帮了我大忙!!!

#9


引用 5 楼 qq646748739 的回复:
Quote: 引用 4 楼 weixin_38847048 的回复:

通过这个字段的上一行减去下一行得到的值生成新的表。  老生长谈的问题 你要给出上一行和下一行 你就得给出排序规则 

楼上的 partition by id order by rownum   哪怕你数据插入的再完美 根据rownum排序oracle并不能保证你一定能得到想要的结果

Quote: 引用 2 楼 qq646748739 的回复:


--1.创建测试表
create table tmp as
select 1 id, 20 percent from dual union all
select 1 id, 30 percent from dual union all
select 1 id, 50 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual;
--2.SQL实现
select id,100-sum(percent)over(partition by id order by rownum) percent
   from tmp;
 



"通过这个字段的上一行减去下一行得到的值生成新的表"  老生长谈的问题 你要给出上一行和下一行 你就得给出排序规则 

这个 partition by id order by rownum   哪怕你数据插入的再完美 根据rownum排序oracle并不能保证你一定能得到想要的结果

 partition by id order by rownum  至少可以得到楼主想要的数据
哪怕数据是以任意顺序插入的,都可以得到。



我尝试用时间字段来代替rownum也是可以得到我想要的结果的,谢谢!!!

#1


sum(percent) over(partition by name over id)

#2



--1.创建测试表
create table tmp as
select 1 id, 20 percent from dual union all
select 1 id, 30 percent from dual union all
select 1 id, 50 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual;
--2.SQL实现
select id,100-sum(percent)over(partition by id order by rownum) percent
   from tmp;
 

#3


经过测试,上述SQL完全满足你的要求,而且性能很高。

#4


通过这个字段的上一行减去下一行得到的值生成新的表。  老生长谈的问题 你要给出上一行和下一行 你就得给出排序规则 

楼上的 partition by id order by rownum   哪怕你数据插入的再完美 根据rownum排序oracle并不能保证你一定能得到想要的结果

引用 2 楼 qq646748739 的回复:

--1.创建测试表
create table tmp as
select 1 id, 20 percent from dual union all
select 1 id, 30 percent from dual union all
select 1 id, 50 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual;
--2.SQL实现
select id,100-sum(percent)over(partition by id order by rownum) percent
   from tmp;
 



"通过这个字段的上一行减去下一行得到的值生成新的表"  老生长谈的问题 你要给出上一行和下一行 你就得给出排序规则 

这个 partition by id order by rownum   哪怕你数据插入的再完美 根据rownum排序oracle并不能保证你一定能得到想要的结果

#5


引用 4 楼 weixin_38847048 的回复:
通过这个字段的上一行减去下一行得到的值生成新的表。  老生长谈的问题 你要给出上一行和下一行 你就得给出排序规则 

楼上的 partition by id order by rownum   哪怕你数据插入的再完美 根据rownum排序oracle并不能保证你一定能得到想要的结果

Quote: 引用 2 楼 qq646748739 的回复:


--1.创建测试表
create table tmp as
select 1 id, 20 percent from dual union all
select 1 id, 30 percent from dual union all
select 1 id, 50 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual;
--2.SQL实现
select id,100-sum(percent)over(partition by id order by rownum) percent
   from tmp;
 



"通过这个字段的上一行减去下一行得到的值生成新的表"  老生长谈的问题 你要给出上一行和下一行 你就得给出排序规则 

这个 partition by id order by rownum   哪怕你数据插入的再完美 根据rownum排序oracle并不能保证你一定能得到想要的结果

 partition by id order by rownum  至少可以得到楼主想要的数据
哪怕数据是以任意顺序插入的,都可以得到。

#6


最不济的一种情况,最终结果再加个order by id, percent 排序也搞定了。

#7


引用 4 楼 weixin_38847048 的回复:
通过这个字段的上一行减去下一行得到的值生成新的表。  老生长谈的问题 你要给出上一行和下一行 你就得给出排序规则 

楼上的 partition by id order by rownum   哪怕你数据插入的再完美 根据rownum排序oracle并不能保证你一定能得到想要的结果

Quote: 引用 2 楼 qq646748739 的回复:


--1.创建测试表
create table tmp as
select 1 id, 20 percent from dual union all
select 1 id, 30 percent from dual union all
select 1 id, 50 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual;
--2.SQL实现
select id,100-sum(percent)over(partition by id order by rownum) percent
   from tmp;
 



"通过这个字段的上一行减去下一行得到的值生成新的表"  老生长谈的问题 你要给出上一行和下一行 你就得给出排序规则 

这个 partition by id order by rownum   哪怕你数据插入的再完美 根据rownum排序oracle并不能保证你一定能得到想要的结果


确实是个老生长谈的问题,之前网上搜了很多但都不是我想要的答案。其实上一行与下一行的排序规则在我的实际项目中还是以时间来排序的,不过为了简化问题描述省略了。不过现在我倒是可以尝试用时间字段代替rownum了,哈哈。谢谢提点!!!

#8


引用 2 楼 qq646748739 的回复:

--1.创建测试表
create table tmp as
select 1 id, 20 percent from dual union all
select 1 id, 30 percent from dual union all
select 1 id, 50 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual;
--2.SQL实现
select id,100-sum(percent)over(partition by id order by rownum) percent
   from tmp;
 


跪谢,帮了我大忙!!!

#9


引用 5 楼 qq646748739 的回复:
Quote: 引用 4 楼 weixin_38847048 的回复:

通过这个字段的上一行减去下一行得到的值生成新的表。  老生长谈的问题 你要给出上一行和下一行 你就得给出排序规则 

楼上的 partition by id order by rownum   哪怕你数据插入的再完美 根据rownum排序oracle并不能保证你一定能得到想要的结果

Quote: 引用 2 楼 qq646748739 的回复:


--1.创建测试表
create table tmp as
select 1 id, 20 percent from dual union all
select 1 id, 30 percent from dual union all
select 1 id, 50 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual union all
select 2 id, 20 percent from dual;
--2.SQL实现
select id,100-sum(percent)over(partition by id order by rownum) percent
   from tmp;
 



"通过这个字段的上一行减去下一行得到的值生成新的表"  老生长谈的问题 你要给出上一行和下一行 你就得给出排序规则 

这个 partition by id order by rownum   哪怕你数据插入的再完美 根据rownum排序oracle并不能保证你一定能得到想要的结果

 partition by id order by rownum  至少可以得到楼主想要的数据
哪怕数据是以任意顺序插入的,都可以得到。



我尝试用时间字段来代替rownum也是可以得到我想要的结果的,谢谢!!!