- Этот вызов основан на реальном использовании, в котором используются диапазоны IP.
- Решение, с которым я пришел, основано на задаче stack trace, который я представил ранее. Каждый пуск дальности рассматривается как операция PUSH, и каждый конец диапазона + 1 рассматривается как операция POP.
Вызов
Мы имеем набор данных диапазонов, где каждый диапазон имеет начальную точку, конечную точку и значение.SQL Challenge/Puzzle: как объединить вложенные диапазоны?
create table ranges
(
range_start int not null
,range_end int not null
,range_val char(1) not null
)
;
Диапазон может содержать другой диапазон или следовать другому диапазону, но не может быть равен другому диапазону или пересекаться с другим диапазоном.
Это действительные отношения между диапазонами:
(1) (2) (3) (4)
--------- --------- --------- -------- -----------
--- --- ---
Эти отношения не действует:
(5) (6)
------- --------
------- --------
Наши первоначальные диапазоны, когда представлены в графическом виде, может выглядеть следующим образом (The письмо представляет range_val):
AAAAAAAA BBCCCCCCC
DDE F GGGGG
H IIII
J
Цель состоит в том, чтобы взять начальный набор диапазонов и создать новый набор по следующему правилу:
содержимого диапазон будет переопределить соответствующий суб-диапазон содержащего диапазона.
Запрошенный результат, когда представлены в графическом виде, может выглядеть примерно так
ADDHAAAF BIIJIGCCC
Требования
- Раствор должен быть один SQL-запрос (подзапросы отлично).
- Использование T-SQL, PL/SQL и т. Д. не разрешено.
- Использование UDF (Пользовательские функции) не допускается.
Sample Data
AAAAAAAAAAAAAAAAAAAAAAAAAAAA BBBB CCCCCCCCCCCCCCCCCCCCCCCCC
DDDE FFFFFFFF GGGGGGGGG HHHHHHHH IIIIIII
JJ KKKLLL MM NN OOOOO
P QQ
insert into ranges (range_start,range_end,range_val) values (1 ,28 ,'A');
insert into ranges (range_start,range_end,range_val) values (31 ,34 ,'B');
insert into ranges (range_start,range_end,range_val) values (39 ,63 ,'C');
insert into ranges (range_start,range_end,range_val) values (1 ,3 ,'D');
insert into ranges (range_start,range_end,range_val) values (4 ,4 ,'E');
insert into ranges (range_start,range_end,range_val) values (7 ,14 ,'F');
insert into ranges (range_start,range_end,range_val) values (19 ,27 ,'G');
insert into ranges (range_start,range_end,range_val) values (43 ,50 ,'H');
insert into ranges (range_start,range_end,range_val) values (55 ,61 ,'I');
insert into ranges (range_start,range_end,range_val) values (1 ,2 ,'J');
insert into ranges (range_start,range_end,range_val) values (9 ,11 ,'K');
insert into ranges (range_start,range_end,range_val) values (12 ,14 ,'L');
insert into ranges (range_start,range_end,range_val) values (22 ,23 ,'M');
insert into ranges (range_start,range_end,range_val) values (25 ,26 ,'N');
insert into ranges (range_start,range_end,range_val) values (57 ,61 ,'O');
insert into ranges (range_start,range_end,range_val) values (13 ,13 ,'P');
insert into ranges (range_start,range_end,range_val) values (60 ,61 ,'Q');
Запрошенных Результаты
(представлены Nulls здесь как пустые пространства)
JJDEAAFFKKKLPLAAAAGGGMMGNNGA BBBB CCCCHHHHHHHHCCCCIIOOOQQCC
range_start range_end range_val
----------- --------- ---------
1 2 J
3 3 D
4 4 E
5 6 A
7 8 F
9 11 K
12 12 L
13 13 P
14 14 L
15 18 A
19 21 G
22 23 M
24 24 G
25 26 N
27 27 G
28 28 A
29 30
31 34 B
35 38
39 42 C
43 50 H
51 54 C
55 56 I
57 59 O
60 61 Q
62 63 C
Дополнительного добавления последняя строка:
64
измените ваш вопрос, чтобы включить только соответствующие теги. –
@ ZoharPeled, теги удалены. –
Любые предлагаемые теги, отличные от SQL? –