2

谷歌搜索了一下,我发现这是一个有趣的问题。想请你们拍。

有我的桌子

USER    |   MAP |   STARTDAY    |   ENDDAY
1       |   A   |   20110101    |   20110105
1       |   B   |   20110106    |   20110110
2       |   A   |   20110101    |   20110107
2       |   B   |   20110105    |   20110110

我想要的是修复用户的2情况,其中映射AB重叠几天(从 20110105 到 20110107)。我希望我能够以永远不会返回重叠范围的方式查询该表。我的输入数据已经很错误了,所以我不必担心冲突处理,我只想能够为任何给定的BETWEEN这些日期获得一个值。

我正在尝试构建的查询的可能输出就像

USER    |   MAP |   STARTDAY    |   ENDDAY
2       |   B   |   20110108    |   20110110 -- pushed overlapping days ahead..
2       |   A   |   20110101    |   20110104 -- shrunk overlapping range

算法是否导致“无效范围”甚至都没有关系,例如 Start = 20110105, End = 20110103,当我遇到这些情况时,我只会设置 null 。

你们会怎么说?有什么直接的方法可以完成这项工作吗?

谢谢!

F。

4

1 回答 1

4

分析函数可以帮助:

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
于 2011-05-20T11:21:49.037 回答