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

CodeRookieGuo 2017-11-14 05:01:31
准确来说,我要从某张表中取某个字段,通过这个字段的上一行减去下一行得到的值生成新的表。

举例来说:

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生成第三笔,以此类推。
...全文
1944 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
CodeRookieGuo 2017-11-15
  • 打赏
  • 举报
回复
引用 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并不能保证你一定能得到想要的结果[/quote] partition by id order by rownum 至少可以得到楼主想要的数据 哪怕数据是以任意顺序插入的,都可以得到。 [/quote] 我尝试用时间字段来代替rownum也是可以得到我想要的结果的,谢谢!!!
CodeRookieGuo 2017-11-15
  • 打赏
  • 举报
回复
引用 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;
 
跪谢,帮了我大忙!!!
CodeRookieGuo 2017-11-15
  • 打赏
  • 举报
回复
引用 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并不能保证你一定能得到想要的结果[/quote] 确实是个老生长谈的问题,之前网上搜了很多但都不是我想要的答案。其实上一行与下一行的排序规则在我的实际项目中还是以时间来排序的,不过为了简化问题描述省略了。不过现在我倒是可以尝试用时间字段代替rownum了,哈哈。谢谢提点!!!
碧水幽幽泉 2017-11-15
  • 打赏
  • 举报
回复
最不济的一种情况,最终结果再加个order by id, percent 排序也搞定了。
碧水幽幽泉 2017-11-15
  • 打赏
  • 举报
回复
引用 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并不能保证你一定能得到想要的结果[/quote]
partition by id order by rownum 至少可以得到楼主想要的数据
哪怕数据是以任意顺序插入的,都可以得到。

花开了叫我 2017-11-15
  • 打赏
  • 举报
回复
通过这个字段的上一行减去下一行得到的值生成新的表。 老生长谈的问题 你要给出上一行和下一行 你就得给出排序规则 楼上的 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并不能保证你一定能得到想要的结果
碧水幽幽泉 2017-11-15
  • 打赏
  • 举报
回复
经过测试,上述SQL完全满足你的要求,而且性能很高。
碧水幽幽泉 2017-11-15
  • 打赏
  • 举报
回复

--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;
卖水果的net 2017-11-14
  • 打赏
  • 举报
回复
sum(percent) over(partition by name over id)

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧