2017-09-26 4 views
1

J'ai une table avec les joueurs, les résultats et ID:Compter le nombre maximum d'occurrences d'une valeur dans SQL Server

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 'W' aura toujours un identifiant de 1,

I besoin de créer une requête qui comptera le nombre maximum de consécutifs « W est pour chaque joueur:

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

J'ai essayé d'utiliser des lignes Unbounded pRÉCÉDANT mais je ne peux l'obtenir pour compter le nombre maximum de Ws au total, et pas c de façon séquentielle

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 

Y a-t-il une approche différente que je peux prendre?

+3

Vous avez besoin d'une colonne pour spécifier la commande. –

+1

Y at-il une colonne qui stocke l'ordre de gagner et de perdre? – TechDo

+0

@GordonLinoff Je suis heureux d'ajouter des colonnes supplémentaires, je ne sais pas comment s'y prendre – PeterH

Répondre

3

Vous avez besoin d'une colonne pour spécifier la commande. Les tables SQL représentent non ordonnées ensembles. Dans la requête ci-dessous, le ? représente cette colonne.

Vous pouvez utiliser la différence des numéros de ligne pour obtenir chaque série de victoires:

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); 

Vous pouvez alors obtenir le maximum:

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

Vous pouvez utiliser 'order by (SELECT 1)'? – DhruvJoshi