15

次の形式のデータがあります。

match_id   team_id   won_ind
----------------------------
37          Team1    N
67          Team1    Y
98          Team1    N
109         Team1    N
158         Team1    Y
162         Team1    Y
177         Team1    Y
188         Team1    Y
198         Team1    N
207         Team1    Y
217         Team1    Y
10          Team2    N
13          Team2    N
24          Team2    N
39          Team2    Y
40          Team2    Y
51          Team2    Y
64          Team2    N
79          Team2    N
86          Team2    N
91          Team2    Y
101         Team2    N

ここでmatch_ids は時系列で表示され、37 がチーム 1 の最初の試合で、217 が最後の試合です。won_indチームが試合に勝ったかどうかを示します。

したがって、上記のデータから、チーム 1 は最初の試合に負け、次に試合に勝ち、次に 2 試合に負け、次に 4 試合連続で勝ち、というようになります。今、私は各チームの最長連勝を見つけることに興味があります。

Team_id   longest_streak
------------------------
Team1     4
Team2     3

plsqlでこれを見つける方法は知っていますが、純粋なSQLで計算できるかどうか疑問に思っていました. LEAD、LAG、および他のいくつかの機能を使用してみましたが、どこにも行きませんでした。

ここでサンプル フィドルを作成しました。

4

4 に答える 4

8

これはうまくいくはずです、フィドルはここにあります:http://sqlfiddle.com/#!4/31f95/27

SELECT   team_id, MAX(seq_length) AS longest_sequence
      FROM (SELECT   team_id, COUNT(*) AS seq_length
                 FROM (SELECT team_id, won_ind,match_id, SUM(new_group) OVER(ORDER BY match_id) AS group_no
                         FROM (SELECT   team_id, won_ind, match_id,
                                        DECODE(LAG(won_ind) OVER(ORDER BY match_id), won_ind, 0, 1) AS new_group
                                   FROM matches
                               ORDER BY team_id))
                WHERE won_ind = 'Y'
             GROUP BY team_id, group_no)
   GROUP BY team_id
   ORDER BY 2 DESC, 1;
于 2013-07-24T16:19:12.203 に答える
3

ここに投稿した回答の変形を使用して

select
    team_id,
    max(wins)
  from
    (
     select
            a.team_id,
            a.match_id amatch,
            b.match_id bmatch,
    (select count(distinct match_id) 
       from matches matches_inner
      where a.team_id = matches_inner.team_id
        and matches_inner.match_id between a.match_id and b.match_id) wins
      from
            matches a
            join matches b on a.team_id = b.team_id 
                      and b.match_id > a.match_id
     where
    not exists 
    (select 'x'
       from matches matches_inner
      where a.team_id = matches_inner.team_id
        and matches_inner.match_id between a.match_id and b.match_id
        and matches_inner.won_ind = 'N')

group by team_id
于 2013-07-24T16:36:06.110 に答える