- In my real life, nested range merging was used. I drew a few sketches and then saw the similarities between the ranges starting and ending for PUSH and POP operations. I realized that solving this problem would also solve the original problem.
- The op column may be removed from the question. When val is NULL, then this is a POP operation, otherwise it is a PUSH operation.
Puzzle
The stack_trace table contains the following columns:
eg.
(NULL values ββare presented here as empty spaces)
Data:
i op val -- -- -- 1 IA 2 IB 3 O 4 IC 5 O 6 O
desired result:
i top_of_stack_val
Requirements
- The solution should be the only SQL query (subqueries in order).
- Only the following sentences are allowed: SELECT , FROM , WHERE , GROUP , HAVING , ORDER BY .
- Using WITH (CTE - Common Table Expression) is not allowed .
- Using T-SQL, PL / SQL, etc. not allowed .
- The use of UDF (Custom Functions) is not permitted .
- The use of variables is not allowed .
Sample data
create table stack_trace ( i int ,op char(1) ,val char(1) ) ; insert into stack_trace (i,op,val) values (1,'I','A'); insert into stack_trace (i,op,val) values (2,'I','B'); insert into stack_trace (i,op,val) values (3,'I','C'); insert into stack_trace (i,op,val) values (4,'I','D'); insert into stack_trace (i,op,val) values (5,'I','E'); insert into stack_trace (i,op) values (6,'O'); insert into stack_trace (i,op) values (7,'O'); insert into stack_trace (i,op) values (8,'O'); insert into stack_trace (i,op,val) values (9,'I','F'); insert into stack_trace (i,op) values (10,'O'); insert into stack_trace (i,op,val) values (11,'I','G'); insert into stack_trace (i,op,val) values (12,'I','H'); insert into stack_trace (i,op) values (13,'O'); insert into stack_trace (i,op) values (14,'O'); insert into stack_trace (i,op,val) values (15,'I','I'); insert into stack_trace (i,op,val) values (16,'I','J'); insert into stack_trace (i,op,val) values (17,'I','K'); insert into stack_trace (i,op,val) values (18,'I','L'); insert into stack_trace (i,op,val) values (19,'I','M'); insert into stack_trace (i,op) values (20,'O'); insert into stack_trace (i,op,val) values (21,'I','N'); insert into stack_trace (i,op) values (22,'O'); insert into stack_trace (i,op,val) values (23,'I','O'); insert into stack_trace (i,op) values (24,'O'); insert into stack_trace (i,op,val) values (25,'I','P'); insert into stack_trace (i,op) values (26,'O'); insert into stack_trace (i,op) values (27,'O'); insert into stack_trace (i,op,val) values (28,'I','Q'); insert into stack_trace (i,op,val) values (29,'I','R'); insert into stack_trace (i,op) values (30,'O'); insert into stack_trace (i,op) values (31,'O'); insert into stack_trace (i,op) values (32,'O'); insert into stack_trace (i,op) values (33,'O'); insert into stack_trace (i,op) values (34,'O'); insert into stack_trace (i,op) values (35,'O'); insert into stack_trace (i,op,val) values (36,'I','S'); insert into stack_trace (i,op) values (37,'O'); insert into stack_trace (i,op) values (38,'O'); insert into stack_trace (i,op,val) values (39,'I','T'); insert into stack_trace (i,op,val) values (40,'I','U'); insert into stack_trace (i,op) values (41,'O'); insert into stack_trace (i,op,val) values (42,'I','V'); insert into stack_trace (i,op,val) values (43,'I','W'); insert into stack_trace (i,op,val) values (44,'I','X'); insert into stack_trace (i,op) values (45,'O'); insert into stack_trace (i,op) values (46,'O'); insert into stack_trace (i,op,val) values (47,'I','Y'); insert into stack_trace (i,op) values (48,'O'); insert into stack_trace (i,op) values (49,'O'); insert into stack_trace (i,op,val) values (50,'I','Z'); insert into stack_trace (i,op) values (51,'O'); insert into stack_trace (i,op) values (52,'O');
Necessary Results
i top_of_stack_val