2013-07-09 33 views
0

我發現難以構建選擇查詢。需要關於Oracle選擇查詢的幫助

PFB,表和相應的數據:

ID DLS  MATCH_STATUS LAST_UPDATE_TIME  BO  CH FT 
1  0   0    09-07-2013 00:00:00 IT  TE NA 
1  1   1    09-07-2013 00:01:01 IT  TE NA 
2  0   0    09-07-2013 10:00:00 IP  TE NA 
3  0   0    09-07-2013 11:00:00 IT  YT NA 
3  2   2    09-07-2013 11:01:00 IT  YT NA 

這裏

Match_Status 0-->Initial Record 
      1-->Singel Match 
      2-->Multi Match 

對於每個記錄將存在與MATCH_STATUS 0和隨後的匹配處理結束其他數目的初始條目如1- ,2將會更新。

我試圖檢索記錄,如總戰績,等待着比賽,單場和多賽組由BO,CH和FT

下面是有望走出放:

BO CH FT TOTAL_RECORD AWAITNG_MATCH SINGLE_MATCH MULTI_MATCH 
IT TE NA 1    0    1    0 
IP TE NA 1    1    0    0 
IT YT NA 1    0    0    2 

我有試圖以下查詢:

select BO,CH,FT,sum(case when match_status=0 then 1 else 0 end) as TOTAL_RECORD, 
sum(case when match_status = 0 then 1 else 0 end) as AWAITING_MATCH, 
sum(case when match_status = 1 then 1 else 0 end) as SINGLE_MATCH, 
sum(case when match_status = 2 then 1 else 0 end) as MULTI_MATCH from 
table1 where last_update_time >= current_timestamp-1 
group by BO,CH,FT; 

問題與上述查詢,awaiting_match是越來越據我所知,因爲MATCH_STATUS = 0的填充相同總記錄同樣地,我試着用

select BO,CH,FT,sum(case when match_status=0 then 1 else 0 end) as TOTAL_RECORD, 
select (sum(case when t1.ms=0 then 1 else 0 end) from 
(select max(match_status) as ms from table1 where last_update_time >= current_timestamp-1 group by id)t1))awaiting_match, 
sum(case when match_status = 1 then 1 else 0 end) as SINGLE_MATCH, 
sum(case when match_status = 2 then 1 else 0 end) as MULTI_MATCH from 
table1 where last_update_time >= current_timestamp-1 
group by BO,CH,FT; 

問題的方法是awaiting_match是越來越填充後續行條目相同的值。

請幫助我一個合適的查詢所需的格式。

非常感謝。

+0

你能解釋一下什麼呢預期輸出列('TOTAL_RECORD AWAITNG_MATCH SINGLE_MATCH MULTI_MATCH')是什麼意思? – luchosrock

+0

它是每個階段記錄的計數。例如,一個id爲1的記錄被插入到表中,那麼它的初始狀態在匹配狀態下將爲0,這只是等待匹配,一旦匹配過程結束,隨後的插入將會發生同樣的記錄,但不同的比賽狀態讓單一比賽說1。等等......總記錄只是id的不同計數,等待匹配是總計數,其記錄當前處於匹配狀態0等等......匹配處理結束和後續插入發生時要記錄的點將被稱爲最新階段 –

回答

0

看來你想要最近的匹配狀態。我猜測這實際上是狀態的最大值。如果是的話,下面的解決上id由第一組問題,然後做分組總結:

select BO, CH, FT, 
     count(*) as TOTAL_RECORD, 
     sum(case when lastms = 0 then 1 else 0 end) as AWAITING_MATCH, 
     sum(case when lastms = 1 then 1 else 0 end) as SINGLE_MATCH, 
     sum(case when lastms = 2 then 1 else 0 end) as MULTI_MATCH 
from (select id, bo, ch, ft, MAX(match_status) as lastms 
     from table1 
     where last_update_time >= current_timestamp-1 
     group by id, bo, ch, ft 
    ) t 
group by BO, CH, FT; 

如果你真的想要的最後一次更新,以提供id的狀態,那麼你可以使用row_number()枚舉行每個ID,以便按更新時間降下來,選擇第一項:

select BO, CH, FT, 
     count(*) as TOTAL_RECORD, 
     sum(case when lastms = 0 then 1 else 0 end) as AWAITING_MATCH, 
     sum(case when lastms = 1 then 1 else 0 end) as SINGLE_MATCH, 
     sum(case when lastms = 2 then 1 else 0 end) as MULTI_MATCH 
from (select id, bo, ch, ft, match_status, 
      ROW_NUMBER() over (partition by id order by last_update_time desc) as seqnum 
     from table1 
     where last_update_time >= current_timestamp-1 
    ) t 
where seqnum = 1 
group by BO, CH, FT; 
+0

Perfecto !!!!!!!謝謝:) –