首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何连胜三胜

如何连胜三胜
EN

Stack Overflow用户
提问于 2015-12-16 10:18:52
回答 4查看 837关注 0票数 6

这张桌子是:

代码语言:javascript
复制
([TeamA],[TeamB],[Win],[date])

('KKR','HYD','KKR',1), 
('KKR','MUM','MUM',2), 
('RCB','HYD','HYD',3), 
('DEL','PUB','PUB',4), 
('RR','PUB','RR',4), 
('RR','DEL','RR',5),
('RCB','CSK','CSK',6),
('RR','CSK','RR',7),
('CSK','MUM','MUM',7),
('MUM','DEL','MUM',8),
('HYD','PUNE','PUNE',9),
('PUB','DEL','DEL',9),
('KKR','DEL','KKR',10),
('KKR','RCB','KKR',10)

所需的答案应该是连续3胜的球队和计数。在这里,RR和妈妈连续赢了3场。KKR有3胜,但是如果我们看到日期列,它不是连续3,因此KKR不应该在答案中,输出应该是

代码语言:javascript
复制
RR 1
MUM 1
EN

回答 4

Stack Overflow用户

发布于 2015-12-16 11:32:48

空隙和岛屿。计算每个岛屿的长度。最后计数是岛的长度除以3(整数除法,丢弃小数部分)。

我增加了几行(团队AB)来说明4胜A,然后7胜B,然后4胜A,这将导致AB的最终计数为2和2。

样本数据

代码语言:javascript
复制
DECLARE @T TABLE (TeamA varchar(50), TeamB varchar(50), Win varchar(50), dt int);

INSERT INTO @T (TeamA, TeamB, Win, dt) VALUES
('KKR','HYD','KKR',1), 
('KKR','MUM','MUM',2), 
('RCB','HYD','HYD',3), 
('DEL','PUB','PUB',4), 
('RR','PUB','RR',4), 
('RR','DEL','RR',5),
('RCB','CSK','CSK',6),
('RR','CSK','RR',7),
('CSK','MUM','MUM',7),
('MUM','DEL','MUM',8),
('HYD','PUNE','PUNE',9),
('PUB','DEL','DEL',9),
('KKR','DEL','KKR',10),
('KKR','RCB','KKR',10),

('A','B','A',11),
('A','B','A',12),
('A','B','A',13),
('A','B','A',14),

('A','B','B',15),
('A','B','B',16),
('A','B','B',17),
('A','B','B',18),
('A','B','B',19),
('A','B','B',20),
('A','B','B',21),

('A','B','A',22),
('A','B','A',23),
('A','B','A',24),
('A','B','A',25);

查询

通常,您会在一个单独的表中有一个团队列表,在这里,我将它构建在一个CTE_Teams中。CTE_Counts有连续连胜的3-wins-in-a-row数。由于一个团队可能有多个连胜记录(请参阅team A),这将被进一步总结。可以在列TeamATeamB中按任何顺序列出团队,因此在CROSS APPLY中的WHERE中有一个OR来捕获这两个变体。

因此,对于每个团队,只选择与此团队相关的行。这是由CROSS APPLY完成的。

然后,用不同的分区对行进行两次编号,这是典型的gaps-and-islands。行号的差异给出了组(岛和间隙)。

过滤WHERE CTE_Teams.Team = CA.Win只留下获胜队伍的岛屿。

CTE_Teams.Team分组给出了岛的大小,即连胜数。

查询工作在Server 2008中。

代码语言:javascript
复制
WITH
CTE_Teams
AS
(
    SELECT T.TeamA AS Team
    FROM @T AS T

    UNION -- sic! not ALL

    SELECT T.TeamB AS Team
    FROM @T AS T
)
,CTE_Counts
AS
(
    SELECT
        CTE_Teams.Team
        --,CA.Win
        --,rn1 - rn2 AS GroupNumber
        --,COUNT(*) AS GroupSize
        ,COUNT(*) / 3 AS FinalCount
    FROM
        CTE_Teams
        CROSS APPLY
        (
            SELECT
                T.Win
                ,T.dt
                ,ROW_NUMBER() OVER (PARTITION BY CTE_Teams.Team 
                    ORDER BY T.dt, T.TeamA, T.TeamB) AS rn1
                ,ROW_NUMBER() OVER (PARTITION BY CTE_Teams.Team, T.Win 
                    ORDER BY T.dt, T.TeamA, T.TeamB) AS rn2
            FROM @T AS T
            WHERE
                T.TeamA = CTE_Teams.Team
                OR T.TeamB = CTE_Teams.Team
        ) AS CA
    WHERE
        CTE_Teams.Team = CA.Win
    GROUP BY
        CTE_Teams.Team
        ,CA.Win
        ,rn1 - rn2
    HAVING COUNT(*) / 3 > 0
)
SELECT
    CTE_Counts.Team
    ,SUM(CTE_Counts.FinalCount) AS FinalCount
FROM CTE_Counts
GROUP BY CTE_Counts.Team
ORDER BY CTE_Counts.Team;

结果

代码语言:javascript
复制
+------+------------+
| Team | FinalCount |
+------+------------+
| A    |          2 |
| B    |          2 |
| MUM  |          1 |
| RR   |          1 |
+------+------------+

SQL Fiddle

票数 1
EN

Stack Overflow用户

发布于 2015-12-16 12:46:50

在不使用CTE的情况下解决这一问题的另一种可能方法是:

代码语言:javascript
复制
create table #a
(
teama varchar(10), teamb varchar(10), win varchar(10), dat int)

insert into #a
values
('KKR','HYD','KKR',1), 
('KKR','MUM','MUM',2), 
('RCB','HYD','HYD',3), 
('DEL','PUB','PUB',4), 
('RR','PUB','RR',4), 
('RR','DEL','RR',5),
('RCB','CSK','CSK',6),
('RR','CSK','RR',7),
('CSK','MUM','MUM',7),
('MUM','DEL','MUM',8),
('HYD','PUNE','PUNE',9),
('PUB','DEL','DEL',9),
('KKR','DEL','KKR',10),
('KKR','RCB','KKR',10);

select 
team, 
win,
row_number() over (partition by team order by dat) matchnum
into #res
  from 
    (
    select teamA team, case when teamA = win then 1 else 0 end as win, dat
    from #a 
    union all
    select teamB team, case when teamB = win then 1 else 0 end , dat
    from #a 
    )A 
order by team,dat


select 
    match1.team, count(*)/3 + 1 cntHatricks
from #res match1 join #res match2 
    on match1.team = match2.team and match2.matchnum = match1.matchnum+1
join #res match3 on match1.team = match3.team and match3.matchnum = match1.matchnum+2
where 
    match1.win = 1 and match2.win = 1 and match3.win = 1            
    group by match1.team

输出

代码语言:javascript
复制
+------+-------------+
| Team | cntHatricks |
+------+-------------+
| MUM  |          1  |
| RR   |          1  |
+------+-------------+
票数 1
EN

Stack Overflow用户

发布于 2015-12-16 18:45:10

尝试这个简单的查询

代码语言:javascript
复制
select  tm,sum(case when win=tm  then 1 else 0 end)/3 hattrick from @a a
inner join (select teama tm from @a union select teamb from @a) t on a.win=t.tm 
group by tm
having count(distinct dat)>2

数据

代码语言:javascript
复制
declare @a table 
(teama varchar(10), teamb varchar(10), win varchar(10), dat int)
insert into @a
values
('KKR','HYD','KKR',1), 
('KKR','MUM','MUM',2), 
('RCB','HYD','HYD',3), 
('DEL','PUB','PUB',4), 
('RR','PUB','RR',4), 
('RR','DEL','RR',5),
('RCB','CSK','CSK',6),
('RR','CSK','RR',7),
('CSK','MUM','MUM',7),
('MUM','DEL','MUM',8),
('HYD','PUNE','PUNE',9),
('PUB','DEL','DEL',9),
('KKR','DEL','KKR',10),
('KKR','RCB','KKR',10)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34309320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档