String 检测重叠范围,然后在oracle中更正
用谷歌搜索一下,我发现这是一个有趣的问题。我想让你们拍几张 有我的桌子吗String 检测重叠范围,然后在oracle中更正,string,oracle,date-range,String,Oracle,Date Range,用谷歌搜索一下,我发现这是一个有趣的问题。我想让你们拍几张 有我的桌子吗 USER | MAP | STARTDAY | ENDDAY 1 | A | 20110101 | 20110105 1 | B | 20110106 | 20110110 2 | A | 20110101 | 20110107 2 | B | 20110105 |
USER | MAP | STARTDAY | ENDDAY
1 | A | 20110101 | 20110105
1 | B | 20110106 | 20110110
2 | A | 20110101 | 20110107
2 | B | 20110105 | 20110110
我想要的是修复用户的2
案例,其中映射A
和B
重叠几天(从20110105到20110107)。
我希望能够以一种不会返回重叠范围的方式查询该表。我的输入数据已经不可靠了,所以我不必担心冲突处理,我只希望能够为这些日期之间的任何给定获取单个值
我试图构建的查询的可能输出如下
USER | MAP | STARTDAY | ENDDAY
2 | B | 20110108 | 20110110 -- pushed overlapping days ahead..
2 | A | 20110101 | 20110104 -- shrunk overlapping range
即使算法导致“无效范围”也无关紧要,例如开始=20110105
,结束=20110103
,当我谈到这些情况时,我会将其置为null
你们会怎么说?有什么直接的方法可以做到这一点吗
谢谢
f、 分析函数可以帮助:
select userid, map
, case when prevend >= startday then prevend+1 else startday end newstart
, endday
from
( select userid, map, startday, endday
, lag(endday) over (partition by userid order by startday) prevend
from mytable
)
order by userid, startday
给出:
USERID MAP NEWSTART ENDDAY
1 A 01/01/2011 01/05/2011
1 B 01/06/2011 01/10/2011
2 A 01/01/2011 01/07/2011
2 B 01/08/2011 01/10/2011