2013-07-18 138 views
1

我有此表下面的Oracle SQL選擇匹配的查詢

uid rid time_type date_time 

a11 1  1   5/4/2013 00:32:00 (row1) 
a43 2  1   5/4/2013 00:32:01 (row2) 
a68 2  2   5/4/2013 00:32:02 (row3) 
a98 2  1   5/4/2013 00:32:03 (row4) 
a45 2  1   5/4/2013 00:32:04 (row5) 
a94 1  2   5/4/2013 00:32:05 (row6) 
a35 2  2   5/4/2013 00:32:07 (row7) 
a33 2  2   5/4/2013 00:32:08 (row8) 

我可以用一個正常的選擇查詢來提取數據,使得它成爲

uid rid time_type date_time 

a11 1  1   5/4/2013 00:32:00 (row1) 
a94 1  2   5/4/2013 00:32:05 (row6) 
a43 2  1   5/4/2013 00:32:01 (row2) 
a68 2  2   5/4/2013 00:32:02 (row3) 
a98 2  1   5/4/2013 00:32:03 (row4) 
a35 2  2   5/4/2013 00:32:07 (row7) 
a45 2  1   5/4/2013 00:32:04 (row5) 
a33 2  2   5/4/2013 00:32:08 (row8) 

的邏輯是1所需求的time_type與相同rid的下一個對應的time_type 2配對。這可以做到嗎?

+1

我不認爲它可以與目前的數據作爲組合或RID和time_type完成無論如何都不是唯一的。 – Phil

+1

我不明白rid = 2情況下的輸出。你有多對time_type = 1,2的行。你怎麼知道如何配對?這是不明確的。 – OldProgrammer

+0

我不認爲它是模棱兩可的。 time_type = 1按date_time排序,然後與下一個time_type = 2配對,最少使用date_time。 –

回答

2

你可以試試這個方法:

-- sample of data from the question 
SQL> with t1(uid1, rid, time_type, date_time) as 
    2 (
    3 select 'a11', 1, 1, '5/4/2013 00:32:00' from dual union all 
    4 select 'a43', 2, 1, '5/4/2013 00:32:01' from dual union all 
    5 select 'a68', 2, 2, '5/4/2013 00:32:02' from dual union all 
    6 select 'a98', 2, 1, '5/4/2013 00:32:03' from dual union all 
    7 select 'a45', 2, 1, '5/4/2013 00:32:04' from dual union all 
    8 select 'a94', 1, 2, '5/4/2013 00:32:05' from dual union all 
    9 select 'a35', 2, 2, '5/4/2013 00:32:07' from dual union all 
10 select 'a33', 2, 2, '5/4/2013 00:32:08' from dual 
11 ) -- the query 
12 select uid1 
13  , rid 
14  , time_type 
15  , date_time 
16 from (select uid1 
17    , rid 
18    , time_type 
19    , date_time 
20    , row_number() over(partition by rid, time_type order by rid) as rn 
21   from t1 
22   ) 
23 order by rid, rn, time_type 
24/

結果:

UID1  RID TIME_TYPE DATE_TIME 
---- ---------- ---------- ----------------- 
a11   1   1 5/4/2013 00:32:00 
a94   1   2 5/4/2013 00:32:05 
a43   2   1 5/4/2013 00:32:01 
a68   2   2 5/4/2013 00:32:02 
a98   2   1 5/4/2013 00:32:03 
a35   2   2 5/4/2013 00:32:07 
a45   2   1 5/4/2013 00:32:04 
a33   2   2 5/4/2013 00:32:08 

8 rows selected 

SQLFiddle Demo