2017-09-26 6 views
1

나는 플레이어, 결과 및 ID가있는 테이블이 있습니다카운트 최대 수

Player | Result | ID 
--------------- 
An  | W  | 1 
An  | W  | 1 
An  | L  | 0 
An  | W  | 1 
An  | W  | 1 
An  | W  | 1 
Ph  | L  | 0 
Ph  | W  | 1 
Ph  | W  | 1 
Ph  | L  | 0 
Ph  | W  | 1 

A, 항상 하나의 ID가됩니다 'W'

I을 각 플레이어 연속 'W의 최대 수를 계산하는 쿼리를 작성해야합니다 : 내가 행 무제한으로 선행을 사용하려고

Player | MaxWinStreak 
--------------------- 
An  | 3  
Ph  | 2 

을하지만 난 단지는 총 WS의 최대 수를 계산하는 얻을 수 있고, C가 아닌 onsecutively

Select 
    t2.player 
    ,max(t2.cumulative_wins) As 'Max' 

    From 

    ( Select 
      t.Player 
      ,Sum(ID) Over (Partition By t.Result,t.player 
      Order By t.GameWeek Rows Unbounded Preceding) As cumulative_wins 

     From 
      t 

      ) t2 

    Group By 
    t2.player 

내가 취할 수있는 다른 접근 방법이 있습니까?

+3

당신은 순서를 지정하는 열이 필요합니다. –

+1

승패의 순서를 저장하는 열이 있습니까? – TechDo

+0

@ GordonLinoff 추가 열을 추가해도 행복 할 것입니다. – PeterH

답변

3

주문을 지정하려면 열이 있어야합니다. SQL 테이블은 을 나타내며 집합 번호는입니다. 아래 쿼리에서 ?은이 열을 나타냅니다.

각 연승을 얻기 위해 행 번호의 차이를 사용할 수 있습니다

select player, count(*) as numwins 
from (select t.*, 
      row_number() over (partition by player order by ?) as seqnum, 
      row_number() over (partition by player, result order by ?) as seqnum_r 
     from t 
    ) t 
where result = 'W' 
group by player, (seqnum - seqnum_r); 

당신은 다음 최대를 얻을 수 있습니다 :

select player, max(numwins) 
from (select player, count(*) as numwins 
     from (select t.*, 
        row_number() over (partition by player order by ?) as seqnum, 
        row_number() over (partition by player, result order by ?) as seqnum_r 
      from t 
      ) t 
     where result = 'W' 
     group by player, (seqnum - seqnum_r) 
    ) pw 
group by player; 
+0

'order by (SELECT 1)'을 사용할 수 있습니까? – DhruvJoshi