【问题标题】:Count max number of consecutive occurrences of a value in SQL Server计算 SQL Server 中某个值的最大连续出现次数
【发布时间】:2017-09-26 12:38:26
【问题描述】:

我有一张包含球员、结果和 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

“W”的 ID 始终为 1,

我需要创建一个查询来计算每个玩家连续“W”的最大数量:

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

我尝试使用 Rows Unbounded Preceeding 但我只能让它计算 Ws 的最大总数,而不是连续计算

    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

我可以采取不同的方法吗?

【问题讨论】:

  • 您需要一列来指定排序。
  • 有没有存储输赢顺序的列?
  • @GordonLinoff 我很高兴添加任何其他列,但不知道该怎么做

标签: sql sql-server gaps-and-islands


【解决方案1】:

您需要一列来指定排序。 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;

【讨论】:

  • 你可以使用order by (SELECT 1)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
相关资源
最近更新 更多