首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Sql查询查找足球数据库中的回归

用Sql查询查找足球数据库中的回归
EN

Stack Overflow用户
提问于 2017-05-20 08:53:37
回答 4查看 690关注 0票数 1

我有四张桌子。

匹配

代码语言:javascript
运行
复制
 | id    | HomeTeamID  | AwayTeamID |
 --------|-------------|------------
 | 1     | 1           | 2
 | 2     | 1           | 3
 | 3     | 3           | 1

目标

代码语言:javascript
运行
复制
 | id    | MatchID     | Minute    | TeamID
 --------|-------------|---------- |---------
 | 1     | 1           |     3     |   2
 | 2     | 1           |     5     |   1
 | 3     | 1           |     15    |   1
 | 4     | 2           |     43    |   3
 | 5     | 2           |     75    |   1
 | 6     | 2           |     85    |   1
 | 7     | 3           |     11    |   1
 | 8     | 3           |     13    |   3
 | 9     | 3           |     77    |   3

Team

代码语言:javascript
运行
复制
 | id    | Name        | 
 --------|-------------|
 | 1     | Chelsea     | 
 | 2     | Arsenal     | 
 | 3     | Tottenham   |

经理

代码语言:javascript
运行
复制
 | id    | Name        | TeamID     |  
 --------|-------------|-------------
 | 1     | Conte       |    1
 | 2     | Wenger      |    2
 | 3     | Pochettino  |    3

我想知道经理们的复出比赛次数。例如,康特的球队在第一场和第二场比赛中丢了第一个球,但是他们赢了。所以康特有两次复出。Pochettino在第3场比赛中有1次复出,我想通过SQL查询找到这个结果。

我为每支球队找到了第一个进球。但经过一些步骤,我正在失去我所做的一切。

代码语言:javascript
运行
复制
SELECT MatchID, MIN(minute), g.TeamID
FROM Goals g
JOIN Managers m ON m.TeamID = g.TeamID
GROUP BY MatchID, g.TeamID
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-05-20 10:44:08

这里的“复出”意味着球队丢了第一个球,但球队赢了这场比赛。

我使用两个一般的子查询,1) winners,其中包含MatchIDTeamID的每个游戏,没有结束为平局。2) first_goals,其中包含了TeamID,它在比赛中打进了第一球。

因此,使用以下方法连接这些子查询:

on winners.MatchID = first_goals.MatchID and winners.TeamID <> first_goals.TeamID

给我们那些比赛,在那里球队赢了,但没有打进第一球(即“复出”)。

最后,我们对TeamsManagers表使用简单的联接:

代码语言:javascript
运行
复制
with Goals(id    , MatchID    , Minute   ,TeamID)   as (
    select 1     , 1           ,     3     ,   2 union all
    select  2     , 1           ,     5     ,   1 union all
    select  3     , 1           ,     15    ,   1 union all
    select 4     , 2           ,     43    ,   3 union all
    select  5     , 2           ,    75    ,   1 union all
    select 6     , 2           ,     85    ,   1 union all
    select  7     , 3           ,     11    ,   1 union all
    select  8     , 3           ,     13    ,   3 union all
    select 9     , 3           ,     77    ,   3 
),
Teams (id, Name) as(
    select 1     ,'Chelsea' union all
    select  2     ,'Arsenal' union all
    select  3     ,'Tottenham'  
),
Managers(id, Name, TeamID) as (
select  1    ,'Conte',    1 union all
select  2     ,'Wenger',   2 union all
select  3     ,'Pochettino',    3
 )

select winners.TeamID, winners.MatchID, Teams.Name, Managers.Name from  ( 
    select t1.* from 
    (
        select TeamID, MatchID, count(*) as goal_scored  from Goals
        group by TeamID, MatchID 
    )t1
    inner join 
    (
        select MatchID, max(goal_scored) as winner_goals_cnt from (
            select TeamID, MatchID, count(*) as goal_scored  from Goals
            group by TeamID, MatchID
        )t
        group by MatchID
        having min(goal_scored) <> max(goal_scored)
    )t2
    on t1.MatchID = t2.MatchID and t1.goal_scored = t2.winner_goals_cnt
) winners
inner join 
(
    select * from (
    select Goals.*, row_number() over(partition by MatchID order by  Minute, id) rn from Goals
    ) f
    where rn = 1
) first_goals
on winners.MatchID = first_goals.MatchID and winners.TeamID <> first_goals.TeamID
inner join Teams
on winners.TeamID = Teams.id
inner join Managers
on winners.TeamID = Managers.TeamID
票数 0
EN

Stack Overflow用户

发布于 2017-05-20 09:56:45

代码语言:javascript
运行
复制
with cte 
(
MatchID,TeamID,TotalGoalTime,NoOfGoals,ManagerName,comeback)
as(SELECT MatchID, g.TeamID,sum(minutea) as'TotalGoalTime' ,count(*)as'NoOfGoals',m.name as'ManagerName'
,comeback =ROW_NUMBER() OVER(PARTITION BY MatchID order by sum(minutea) desc) 
FROM Goals g
JOIN Managers m ON m.TeamID = g.TeamID
join [Teams] t on t.Id=g.TeamId
GROUP BY MatchID, g.TeamID,m.name )
Select MatchID,TeamID,NoOfGoals,ManagerName from cte where comeback =1

以上查询目前给我们的整体回归,将更新的no回来。

票数 1
EN

Stack Overflow用户

发布于 2017-05-20 10:10:20

如果你想计数每一次复出的足球比赛,你可以使用下面的解决方案。那么,东山再起的定义是,每当一支球队在输掉比赛后,再进一球,对手就多进一球。例如,对于以下场景,我们有三次卷土重来:

代码语言:javascript
运行
复制
Team A  Team B
  0    -   1     //team b scores
  1    -   1     //team a scores
  2    -   1     //team a scores (comeback for a)
  2    -   2     //team b scores 
  2    -   3     //team b scores (comeback for b)
  3    -   3     //team a scores
  4    -   3     //team a scores (comeback for a)

从上面看,我们似乎已经卷土重来了,当比分改变了,而之前的分数是平的。我使用总和过关ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW排序,由minute来计算每次进球时的得分。

以下是完整的工作示例:

代码语言:javascript
运行
复制
DECLARE @matches TABLE
(   
    [id] TINYINT
   ,[HomeTeamID] TINYINT
   ,[AwayTeamID] TINYINT
);

DECLARE @Goals TABLE
(
    [id] TINYINT
   ,[MatchID] TINYINT
   ,[Minute] TINYINT
   ,[TeamID] TINYINT
);

DECLARE @Teams TABLE
(
    [id] TINYINT
   ,[Name] VARCHAR(12)
);

DECLARE @Managers TABLE
(
    [Id] TINYINT
   ,[Name] VARCHAR(12)
   ,[TeamID] TINYINT
);

INSERT INTO @matches ([id], [HomeTeamID], [AwayTeamID])
VALUES (1, 1, 2)
      ,(2, 1, 3)
      ,(3, 3, 1)
      ,(4, 1, 4);

INSERT INTO @Goals ([id], [MatchID], [Minute], [TeamID])
VALUES (1, 1, 3, 2)
      ,(2, 1, 5, 1)
      ,(3, 1, 15, 1)
      ,(4, 2, 43, 3)
      ,(5, 2, 75, 1)
      ,(6, 2, 85, 1)
      ,(7, 3, 11, 1)
      ,(8, 3, 13, 3)
      ,(9, 3, 77, 3)
      ,(10, 4, 3, 1)
      ,(11, 4, 5, 4)
      ,(12, 4, 10, 4)
      ,(13, 4, 12, 1)
      ,(14, 4, 25, 1)
      ,(15, 4, 46, 4)
      ,(16, 4, 60, 4)
      ,(17, 4, 72, 4)
      ,(18, 4, 84, 4);

INSERT INTO @Teams ([id], [Name])
VALUES (1, 'Chelsea')
      ,(2, 'Arsenal')
      ,(3, 'Tottenham')
      ,(4, 'Real Madrid');

INSERT INTO @Managers ([Id], [Name], [TeamID])
VALUES (1, 'Conte', 1)
      ,(2, 'Wenger', 2)
      ,(3, 'Pochettino', 3)
      ,(4, 'Zidane', 4);

WITH DataSource AS
(
    SELECT m.[id]
          ,m.[HomeTeamID]
          ,m.[AwayTeamID]
          ,ROW_NUMBER() OVER (PARTITION BY m.[id] ORDER BY g.[minute]) AS [EventID]
          ,IIF
           (
                SUM(IIF(m.[HomeTeamID] = g.[teamID], 1, 0)) OVER (PARTITION BY m.[id] ORDER BY g.[minute] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - 1
                =
                SUM(IIF(m.[AwayTeamID] = g.[teamID], 1, 0)) OVER (PARTITION BY m.[id] ORDER BY g.[minute] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
                OR
                SUM(IIF(m.[HomeTeamID] = g.[teamID], 1, 0)) OVER (PARTITION BY m.[id] ORDER BY g.[minute] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 
                =
                SUM(IIF(m.[AwayTeamID] = g.[teamID], 1, 0)) OVER (PARTITION BY m.[id] ORDER BY g.[minute] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) -1
               ,IIF(m.[HomeTeamID] = g.[teamID], 'H', 'A') -- (H)ome come back, (A)way come ba
              ,'N' -- no come back
           ) AS [ComeBack]
    FROM @matches m
    INNER JOIN @Goals g
        ON m.[id] = g.[MatchID]
)
SELECT T.[Name]
FROM DataSource DS
INNER JOIN @Teams T
    ON IIF([ComeBack] = 'H', [HomeTeamID], [AwayTeamID]) = T.[id]
WHERE DS.[EventID] <> 1
    AND DS.[ComeBack] <> 'N';

上述情况将使我们:

代码语言:javascript
运行
复制
Chelsea
Chelsea
Chelsea
Tottenham
Real Madrid
Real Madrid

注意,我又添加了一个匹配来演示这一点。

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

https://stackoverflow.com/questions/44083851

复制
相关文章

相似问题

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