需要有关Oracle Select Query的帮助

时间:2013-07-09 17:34:13

标签: sql 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;

以上查询的问题是,由于match_status = 0,awaiting_match的填充与我记录的总记录相同 同样我尝试了

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正在填充后续行条目的相同值。

请帮助我找到所需格式的合适查询。

提前多多感谢。

1 个答案:

答案 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;