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