* This challenge is based on a real life use-case involving IP ranges.
* The solution I came with is based on the [stack trace](https://stackoverflow.com/questions/39936479/sql-challenge-puzzle-given-a-stack-trace-how-to-find-the-top-element-at-each/39941615#39941615) challenge I've presented previously. Each range start is treated as a **PUSH** operation and each range end + 1 is treated as a **POP** operation.

---

The Challenge
=============

We have a data set of ranges where each range has a starting point, ending point and a value.

```
create table ranges
(
    range_start     int         not null
   ,range_end       int         not null
   ,range_val       char(1)     not null
)
;

```

A range can contain another range or follow another range, but cannot be equal to another range or intersect with another range.

These are **valid** relations between ranges:

```
(1)           (2)           (3)           (4)
---------     ---------     ---------     -------- -----------
---                 ---        ---

```

These relations are **not valid**:

```
(5)                (6)
-------        --------       
-------              --------

```

Our initial ranges, when presented graphically, might look something like this (The letter represents **range\_val**):

```
AAAAAAAA  BBCCCCCCC
 DDE   F   GGGGG
   H       IIII
             J

```

The goal is to take the initial set of ranges and create a new set under the following rule:

**A contained range will override the corresponding sub-range of the the containing range.** 

The requested result, when presented graphically, might look something like this

```
ADDHAAAF  BIIJIGCCC

```

Requirements
============

* The solution should be a single SQL query (sub-queries are fine).
* The use of T-SQL, PL/SQL etc. **is not allowed**.
* The use of UDF (User Defined Functions) **is not allowed**.

Data Sample
===========

```
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');

```

Requested Results
=================

(Nulls are presented here as empty spaces)

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

```

Optional addition final row:

```
64

```