Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 计算帽子戏法的数量,即连续3次获胜(1胜0负)_Sql_Sql Server 2008 - Fatal编程技术网

Sql 计算帽子戏法的数量,即连续3次获胜(1胜0负)

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

从结果中计算帽子戏法的数量。i、 例如,连续赢3场(此处
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