1

4 개의 테이블이 있습니다.Sql 쿼리를 사용하여 축구 데이터베이스에서 복귀 찾기

일치 :

| id | HomeTeamID | AwayTeamID | 
--------|-------------|------------ 
| 1  | 1   | 2 
| 2  | 1   | 3 
| 3  | 3   | 1 

목표 :

| 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 

:

| id | Name  | 
--------|-------------| 
| 1  | Chelsea  | 
| 2  | Arsenal  | 
| 3  | Tottenham | 

관리자는 :

나는 컴백의 수는 관리자를위한 일치 싶어. 예를 들어, 콩테 팀은 경기 1과 2에서 첫 번째 골을 인정했지만 승리했습니다. 그래서 콩테에는 2 번의 컴백이 있습니다. Pochettino는 3 경기에서 1 컴백을했습니다. 나는 그것을 SQL Query로 찾고 싶습니다.

각 팀의 첫 경기 목표를 찾았습니다. 그러나 몇 단계를 거치면 내가하는 일을 잃어 버리게됩니다.

SELECT MatchID, MIN(minute), g.TeamID 
FROM Goals g 
JOIN Managers m ON m.TeamID = g.TeamID 
GROUP BY MatchID, g.TeamID 

답변

0

"컴백"은 팀이 첫 번째 목표를 인정했지만 팀이이 게임에서 승리했다는 의미입니다.

나는 2 개의 일반적인 하위 쿼리 인 1) 을 사용하는데, 여기에는 무승부로 끝나지 않은 각 게임에서 MatchIDTeamID이 포함되어 있습니다. 그리고 2) first_goals에는 TeamID가 포함되어있어 경기에서 첫 골을 기록했습니다.

그래서 사용하여 이러한 하위 쿼리 사이에 가입 :

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

것은 우리 팀이 승리하는 matchs을 제공하지만, 첫 번째 목표 (즉 "악")를 득점 없습니다.

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 
:

마지막으로 우리는 간단한 TeamsManagers 테이블 조인 사용

0

나는 축구의 대부분을 수행하지만, 팀이 첫 골을 얻어냅니다하지만 게임에서 승리 할 때 복귀가 있다고 가정하지 않습니다, 나는 결과를 얻기 위해 다음과 같은 논리를 사용합니다. 각각의 일치, 우리가 첫 골을 팀 승리에 갔다 일치해야

SELECT TeamID, MatchID FROM Goals WHERE GoalID in 
    (SELECT Min(GoalID) FROM Goals GROUP BY MatchID) 

둘째 :

첫째, 우리는 경기에서 첫 골을 실점 한 팀이 필요합니다.

SELECT MatchID FROM 
(SELECT COUNT(GoalID) as TotalGoals, MatchID FROM Goals GROUP BY MatchID) AS MatchSummary 
INNER JOIN 
(SELECT COUNT(GoalID) as TeamGoals, MatchID FROM 
    (SELECT TeamID, MatchID FROM Goals WHERE GoalID in 
     (SELECT Min(GoalID) FROM Goals GROUP BY MatchID) 
) as GoalsOfTheTeamThatConcededFirstGoal 
GROUP BY MatchID) as SummaryOfTeamThatConcededFirstGoal 
ON MatchSummary.MatchID = SummaryOfTeamThatConcededFirstGoal.MatchID 
WHERE (TotalGoals - TeamGoals) < TeamGoals 

이러한 두 가지 검색어를 결합하면 컴백을 한 팀에 대한 팀 ID를 얻을 수 있습니다.

커서 나 임시 테이블을 사용하면이 작업을 훨씬 잘 수행 할 수 있다고 생각하지만 가능한 한 간단하게 대답을 유지하려고합니다. 그러므로 나는 그것을 피했다. 이 두 가지 방법을 확실히 탐구해야합니다.

1
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 

위의 쿼리는 지금 우리에게 전반적인 복귀를 제공합니다.

1

축구 경기에서 모든 컴백을 계산하려는 경우 아래 해결책을 사용할 수 있습니다. 그런 다음 컴백의 정의는 팀이 한 번 더 골을 넣을 때마다 풀려 난 후입니다. 이 점수가 변경 될 때, 우리는 컴백을 것 같다 위부터

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) 

, 이전 점수도했다 예를 들어, 다음과 같은 시나리오에 대해 우리는 세 컴백 있습니다. 나는 SUMOVER으로, ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROWminute으로 주문하여 골이 득점 될 때마다 점수를 계산합니다.

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'; 

은 위의 우리에게 줄 것이다 :

여기에 전체 작업 예입니다

Chelsea 
Chelsea 
Chelsea 
Tottenham 
Real Madrid 
Real Madrid 

주, 나는 이것을 입증하는 또 하나의 일치를 추가했습니다.

관련 문제