2013-07-09 5 views
0

Мне сложно создать запрос выбора.Нужна помощь по Oracle Select Query

ПФБ, за столом и соответствующих данных:

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

Его счет записи на каждом этапе. Например, запись с идентификатором 1, вставленным в таблицу, тогда его начальный статус будет 0 в статусе соответствия, который является ничем иным, как ожидающим совпадением, после согласования конца процесса последующая вставка произойдет с одна и та же запись, но другой статус соответствия позволяет говорить 1 для одиночного совпадения. и т. д. ... Итоговая запись - это не что иное, как счетчик id, ожидающий совпадение - это полный счет, чьи записи в настоящее время находятся в статусе соответствия 0 и т. д. ... указывается, как только соответствующий конец процесса и последующая вставка будут известны как последние stage –

ответ

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() для перечисления строки для каждого идентификатора, заказ по времени обновления по убыванию, и выбрать первый один:

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 !!!!!!! Спасибо :) –