数据区间重叠处理问题

zhaoxiao1978 2015-05-05 04:04:46
如:
xh num1 num2
1 10015 60080
2 20022 80090
3 30250 40900
判断数据重叠区间后最后形成一条记录为:1 10015 80090

xh num1 num2
1 10015 30080
2 20022 50090
3 60250 90900
处理后为:

xh num1 num2
1 10015 50090
2 60250 90900

哪位兄弟帮我分析处理下。谢谢了!!!!
...全文
515 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
一头大葱 2015-07-01
  • 打赏
  • 举报
回复
原理是判断是否可以和上一行合并成同一个区间,如果不可以则处理成另一个分组,可以则处理成同一个分组(+0),最后在每组算最小最大端点即可。

但SQL本身没有序运算,这个思路就要写成上面那种嵌套的方式,很费劲。如果是JAVA+SQL环境,还可以用润乾集算器简化:
A1 $select num1,num2 from tb order by num1
A2 =a=0
A3 =A1.groups@o(a+=if(num1>num2[-1],1,0):xh;min(num1):num1,max(num2):num2)

工作原理和上面的SQL是一样的,计算结果:


集算器提供了JDBC接口,可以像数据库一样嵌入到应用中,使用简单也免费。这还有一些有序计算的例子http://blog.raqsoft.cn/?p=5186 .
qq_27931103 2015-05-08
  • 打赏
  • 举报
回复
with tt as ( select 1 xh, 10015 num1, 30080 num2 from dual union all select 2 xh, 20022 num1, 50090 num2 from dual union all select 3 xh, 60250 num1, 90900 num2 from dual ) select row_number()over(order by rn) xh, min(num1) num1, max(num2) num2 from ( select num1, num2, last_value(case when rn is not null then rn end ignore nulls)over(order by rownum) rn from ( select num1, num2, lag(num2)over(order by xh), (case when num1 - lag(num2)over(order by xh) < 0 then null else xh end) rn from tt ) t ) t1 group by rn
jdsnhan 2015-05-06
  • 打赏
  • 举报
回复
没看懂需求,什么意思,想实现什么

17,086

社区成员

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

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