Sql 计算帽子戏法的数量,即连续3次获胜(1胜0负)
从结果中计算帽子戏法的数量。i、 例如,连续赢3场(此处Sql 计算帽子戏法的数量,即连续3次获胜(1胜0负),sql,sql-server-2008,Sql,Sql Server 2008,从结果中计算帽子戏法的数量。i、 例如,连续赢3场(此处Result1表示赢,0表示输) 尽管我非常讨厌游标,但我想不出其他方法可以在SQL Server 2008中轻松实现这一点,因此您可以尝试以下方法: Declare @count int = 0, @Streak int = 0, @Hattrick int = 0 Declare foobar cursor forward_only for Select Streak from Tablename Op
Result
1表示赢,0表示输)
尽管我非常讨厌游标,但我想不出其他方法可以在SQL Server 2008中轻松实现这一点,因此您可以尝试以下方法:
Declare @count int = 0,
@Streak int = 0,
@Hattrick int = 0
Declare foobar cursor forward_only for Select Streak from Tablename
Open foobar
fetch next from foobar into @Streak
While @@FETCH_STATUS = 0
Begin
If @Streak = 1
Set @count = @count + 1
else
Set @count = 0
if @count = 3
begin
Set @Hattrick = @Hattrick + 1
Set @count = 0
end
Fetch next from foobar into @Streak
End
Select @Hattrick
对于SQL Server的更高版本,我将混合使用交叉应用和延迟。不幸的是,Lag仅在SQL Server 2014及以后版本中可用
SQL Fiddle:
对于SQL Server 2014,请使用交叉应用和延迟:
Select Sum(Hattrick) Hattricks
from
(Select Case when c.Streak = 1 and lag(c.Streak, 1,0) over (order by c.MatchNo) = 0 and lag(c.Streak, 2,0) over (order by c.MatchNo) = 0 then 1 else 0 end Hattrick
from @foobar f
Cross apply
(select case when f.Streak = 1 and Streak = 1 then 1 else 0 end Streak, MatchNo from @foobar where MatchNo = f.MatchNo - 1) b
Cross apply
(select case when b.Streak = 1 and Streak = 1 then 1 else 0 end Streak, MatchNo from @foobar where MatchNo = b.MatchNo - 1) c) Hat
SQL Fiddle:没有游标的另一种方式可能是这样的。这将6个连续连胜视为2个帽子戏法。要把它看作是一个单一的条带,我们需要把最终的<代码>和(连线)改为<代码>计数(连线)
当streak=1时,这是否表示它是一个帽子戏法?1表示赢,0表示输,实际上这里的streak是一个结果。你如何定义帽子戏法?预期的输出是什么(样本输入如所示)。@ddsprasad那么,数据中的hatrick定义是什么?一行中的6个streak=1是否意味着两个独立的帽子戏法?有一种非光标方式,但它涉及到自连接表3次(使用“匹配”列上的连接基本上检查前2个连胜是1,前3个连胜是0)但这里的光标可能更整洁。是的,我尝试过,问题是它必须在3后重置计数。因此,如果你连续赢了6场,那么只有2个帽子戏法(2个3连胜).我做了你所描述的,我努力让它在不使用滞后的情况下在第一组3之后重置。但是,连续6场胜利仍然是1场帽子戏法?这就是为什么你需要将前三场比赛设为0。连续6场胜利都是2场帽子戏法,因为帽子戏法是连续3场胜利,所以连续6场胜利将是2 x 3场胜利=2场帽子戏法或t这就是我对这个模棱两可的问题的理解。哈哈,也许如果op的问题不是那么模棱两可的话,我们真的会知道。如果他说得更清楚,那么我会相应地更新。
Select Sum(Hattrick) Hattricks
from
(Select Case when c.Streak = 1 and lag(c.Streak, 1,0) over (order by c.MatchNo) = 0 and lag(c.Streak, 2,0) over (order by c.MatchNo) = 0 then 1 else 0 end Hattrick
from @foobar f
Cross apply
(select case when f.Streak = 1 and Streak = 1 then 1 else 0 end Streak, MatchNo from @foobar where MatchNo = f.MatchNo - 1) b
Cross apply
(select case when b.Streak = 1 and Streak = 1 then 1 else 0 end Streak, MatchNo from @foobar where MatchNo = b.MatchNo - 1) c) Hat
DECLARE @StreakTable Table (MatchNo int, Match_date date, Name varchar(20), Streak int)
Insert into @StreakTable values
(1, '2015-04-08', 'Aditya',1),
(2, '2015-04-09', 'Aditya',1),
(3, '2015-04-10', 'Aditya',0),
(4, '2015-04-11', 'Aditya',0),
(5, '2015-04-12', 'Aditya',1),
(6, '2015-04-13', 'Aditya',1),
(7, '2015-04-14', 'Aditya',1)
;WITH CTE AS
(
SELECT MatchNo,Match_date,Name,Streak,
ROW_NUMBER() OVER(PARTITION BY Name ORDER BY Match_date) -
ROW_NUMBER() OVER(PARTITION BY Name,streak ORDER BY Match_date)num
FROM @StreakTable
), CountStreak as
(
SELECT Name,COUNT(*)/3 Streak
FROM CTE
WHERE Streak = 1
GROUP BY num,Name
HAVING COUNT(*) >= 3
)
SELECT Name,SUM(Streak) as TotalStreak
FROM CountStreak
GROUP BY Name