- Моят реален случай на употреба беше да обединявам вложени диапазони. Начертах някои скици и след това видях приликата между диапазони, започващи и завършващи за стек на PUSH и POP операции. Разбрах, че решаването на този проблем ще реши и първоначалния проблем.
- Колоната op всъщност може да бъде премахната от въпроса. Когато val е NULL, това е POP операция, в противен случай е PUSH операция.
Пъзелът
Таблица, stack_trace, съдържа следните колони:
- i - Цяло число, което представлява момент от време.
- op - 2 възможни операции: I ("in"/"push") и O ("out"/"pop").
val - Стойността, въведена от операцията "in"/"push" или NULL за операция "out"/"pop".
Целта е да се намери каква е била стойността в горната част на стека във всеки момент от време (i).
e.g.
(NULL стойностите са представени тук като празни интервали)
данни:
i op val
-- -- --
1 I A
2 I B
3 O
4 I C
5 O
6 O
Необходим резултат:
i top_of_stack_val
-- ----------------
1 A
2 B
3 A
4 C
5 A
6
Изисквания
- Решението трябва да бъде единична SQL заявка (подзаявките са добри).
- Разрешени са само следните клаузи: SELECT, FROM, WHERE, GROUP BY, HAVING силна>, ПОРЪЧАЙТЕ ОТ.
- Използването на клауза WITH (CTE - Общ табличен израз) не е разрешено.
- Използването на T-SQL, PL/SQL и др. не е разрешено.
- Използването на UDF (дефинирани от потребителя функции) не е разрешено.
- Използването на променливи не е разрешено.
Примерни данни
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');
Необходими резултати
i top_of_stack_val
-- ----------------
1 A
2 B
3 C
4 D
5 E
6 D
7 C
8 B
9 F
10 B
11 G
12 H
13 G
14 B
15 I
16 J
17 K
18 L
19 M
20 L
21 N
22 L
23 O
24 L
25 P
26 L
27 K
28 Q
29 R
30 Q
31 K
32 J
33 I
34 B
35 A
36 S
37 A
38
39 T
40 U
41 T
42 V
43 W
44 X
45 W
46 V
47 Y
48 V
49 T
50 Z
51 T
52