Определите перекрывающиеся диапазоны и исправьте их в оракуле - PullRequest
2 голосов
/ 20 мая 2011

Погуглив немного, я нашел это интересным вопросом. Хотели бы вы, ребята, выстрелы.

Наличие моего стола

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). Мне бы хотелось, чтобы я мог запросить эту таблицу таким образом, чтобы она никогда не возвращала перекрывающиеся диапазоны. Мои входные данные уже неверны, поэтому мне не нужно беспокоиться об обработке конфликта, я просто хочу иметь возможность получить единственное значение для любой данной BETWEEN этих дат.

Возможные выходные данные для запроса, который я пытаюсь построить, будут выглядеть как

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

Не имеет значения, вызывает ли алгоритм «недопустимые диапазоны», например Start = 20110105, End = 20110103, я просто поставлю ноль, когда доберусь до этих случаев.

Что бы вы сказали, ребята? Есть ли прямой способ сделать это?

Спасибо!

е.

1 Ответ

4 голосов
/ 20 мая 2011

Аналитические функции могут помочь:

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
...