0

選択クエリを構成するのが難しいと感じています。

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 が後続の行エントリに同じ値で入力されることです。

希望するフォーマットに適したクエリを教えてください。

よろしくお願いします。

4

1 に答える 1

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;
于 2013-07-09T18:40:10.710 に答える