计算 SQL 服务器中某个值连续出现的最大次数
Count max number of consecutive occurrences of a value in SQL Server
我有 table 球员、成绩和 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 '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
我可以采用其他方法吗?
您需要一列来指定排序。 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;
我有 table 球员、成绩和 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 '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
我可以采用其他方法吗?
您需要一列来指定排序。 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;