|
昨天看到Newkid版主给我短信,发现了这道题。
明明最近忙的要死,就是忍不住手痒。
今天ITPUB大会上琢磨了一下,导致两个演讲完全没有听
坐车回来的路上想了一下,有点心得,于是晚上就写下来了
SQL> WITH C AS
2 (SELECT NAME, TIME, POWER(2, ROWNUM - 1) POS FROM BRIDGE_CROSSING),
3 A AS
4 (SELECT 0 RN, A.NAME || ' ' || B.NAME NAME, GREATEST(A.TIME, B.TIME) TIME, A.POS + B.POS POS
5 FROM C A, C B
6 WHERE A.NAME < B.NAME
7 UNION ALL
8 SELECT 1, NAME, TIME, POS FROM C),
9 B (RN, NAME, F_NAME, TIME, POS) AS
10 (SELECT 0 RN, CAST ('' AS VARCHAR2(4000)) NAME, CAST('' AS VARCHAR2(4000)) F_NAME, 0, 0 POS FROM DUAL
11 UNION ALL
12 SELECT B.RN + 1,
13 LTRIM(B.NAME || DECODE(MOD(B.RN, 2), 0, ' ', ',') || A.NAME),
14 DECODE(MOD(B.RN, 2), 0, B.F_NAME || REPLACE(A.NAME, ' ', ''), REPLACE(B.F_NAME, A.NAME, '')),
15 B.TIME + A.TIME,
16 DECODE(MOD(B.RN, 2), 0, B.POS + A.POS, B.POS - A.POS)
17 FROM B, A
18 WHERE MOD(B.RN, 2) = A.RN
19 AND DECODE(MOD(B.RN, 2), 0, BITAND(B.POS, A.POS), BITAND(B.POS - A.POS, A.POS)) = 0)
20 SELECT NAME, TIME FROM
21 (SELECT NAME, TIME, RANK() OVER(ORDER BY TIME) RN
22 FROM B
23 WHERE POS = 15)
24 WHERE RN = 1;
NAME TIME
------------------------------ ----------
A B,A C D,B A B 17
A B,B C D,A A B 17
|
|