2017-12-14 12 views
-2

각 팀에서 집과 결원에서 한 번씩 서로 경기 할 토너먼트를 만들려고합니다.SQL 토너먼트 날짜 생성기

나는 매주 금요일 팀이 하나를 재생할 수 있도록 날짜를 생성 할 또 다른

TempExampletable 최종 결과는 각 팀이 일주일에 한 번 연주와 모양을 보여줍니다.

TempExampleTable2는 내가 현재 가지고있는 데이터와 날짜를 생성하기 위해 사용할 데이터를 보여줍니다.

DROP TABLE TempExampletable; 
DROP TABLE TempExampletable2; 

CREATE TABLE TempExampletable(
Home VARCHAR(100), 
Away VARCHAR (100), 
    Playing DATETIME 
) 

INSERT INTO TempExampletable VALUES 
('Team 1', 'Team 2', '2017/12/01 17:30:00'), 
('Team 1', 'Team 3', '2017/12/08 17:30:00'), 
('Team 1', 'Team 4', '2017/12/15 17:30:00'), 
('Team 2', 'Team 1', '2017/12/22 17:30:00'), 
('Team 2', 'Team 3', '2017/12/15 17:30:00'), 
('Team 2', 'Team 4', '2017/12/08 17:30:00'), 
('Team 3', 'Team 1', '2017/12/29 17:30:00'), 
('Team 3', 'Team 2', '2018/11/05 17:30:00'), 
('Team 3', 'Team 4', '2017/12/01 17:30:00'), 
('Team 4', 'Team 1', '2018/01/05 17:30:00'), 
('Team 4', 'Team 2', '2017/12/29 17:30:00'), 
('Team 4', 'Team 3', '2017/12/22 17:30:00') 

CREATE TABLE TempExampletable2(
Home VARCHAR(100), 
Away VARCHAR (100), 
    Playing DATETIME 
) 

INSERT INTO TempExampletable2(Home, Away) VALUES 
('Team 1', 'Team 2'), 
('Team 1', 'Team 3'), 
('Team 1', 'Team 4'), 
('Team 2', 'Team 1'), 
('Team 2', 'Team 3'), 
('Team 2', 'Team 4'), 
('Team 3', 'Team 1'), 
('Team 3', 'Team 2'), 
('Team 3', 'Team 4'), 
('Team 4', 'Team 1'), 
('Team 4', 'Team 2'), 
('Team 4', 'Team 3') 

SELECT * FROM TempExampletable2 ORDER BY Playing ASC; 
SELECT * FROM TempExampletable ORDER BY Playing ASC; 
+2

코드를 올바르게 포맷하십시오. 구체적이고 좁은 질문을하십시오 (즉, 코드가 작동하지 않는 것은 무엇입니까?). 더 나은 방법은 [묻는다]를 읽고 돌아와 다시 시도하십시오. –

+0

예상 출력을 추가 할 수 있습니까? – Ramesh

+0

고마워, 그걸 내 전화기에 표시했는데 제출했을 때 그걸 벗겼다 – BiscuitCookie

답변

0

다음은 해결책입니다. 당신이 원하는대로 날짜를 포맷하거나 당신은 날짜 열

WITH teams AS 
(SELECT Home, Away, 
     row_number() over(order by Home, Away) - 1 AS r_num 
    FROM TempExampletable2) 
SELECT Home, Away, DATEADD(week, r_num, '2017/12/01 17:30:00') AS Playing 
    FROM teams 
    ORDER BY Playing ASC; 

출력

Home Away Playing 
Team 1 Team 2 2017-12-01T17:30:00Z 
Team 1 Team 3 2017-12-08T17:30:00Z 
Team 1 Team 4 2017-12-15T17:30:00Z 
Team 2 Team 1 2017-12-22T17:30:00Z 
Team 2 Team 3 2017-12-29T17:30:00Z 
Team 2 Team 4 2018-01-05T17:30:00Z 
Team 3 Team 1 2018-01-12T17:30:00Z 
Team 3 Team 2 2018-01-19T17:30:00Z 
Team 3 Team 4 2018-01-26T17:30:00Z 
Team 4 Team 1 2018-02-02T17:30:00Z 
Team 4 Team 2 2018-02-09T17:30:00Z 
Team 4 Team 3 2018-02-16T17:30:00Z 
+0

안녕하세요, 감사합니다. 첫 번째 테이블 팀 1의 예제 날짜를 보면 1 주일에 한 팀이 아닌 여러 팀이 같은 날에 플레이하기를 원합니다. 팀 3은 1 주에도 팀 4를 담당하지만 – BiscuitCookie

+0

확실합니다. 어느 팀이 어떤 날에 경기를 결정합니까? 알고리즘이 있습니까? – Ramesh

+0

아니요,이 질문의 요지는 각 팀이 예제 데이터에 표시된 것처럼 일주일에 한 번 재생해야한다는 것입니다. 그러므로 주당 2 경기가 있어야합니다. 팀은 일주일에 두 번 연주해서는 안됩니다. – BiscuitCookie

0

당신은 포함 된 4 개 팀이 있기 때문에, 일주일에 2 개 매치업이 있다는 것을 알고에 삽입 할 수있는하시기 바랍니다. 주어진 주간에 한 번의 매치업을 계획한다면, 두 번째 매치업은 첫 번째 매치업의 참가자 중 하나와 관련 될 수 없다는 것을 안다. (Team 1Home/Away 결정에 관계없이 Team 2Team 3을 동시에 재생할 수 없습니다.)이 시나리오는 재귀 적 CTE 또는 다른 방법을 사용하는 집합 기반 방식으로 처리하기 어렵게 만듭니다.

위의 내용은 토너먼트 시즌을 계획하기 위해 이중 중첩 while 루프를 작성한 이유입니다. 첫 번째 루프는 매주 진행되며, 두 번째 루프는 매 반복마다 매치업을 계획합니다. 나는 팀의 목록을 아래로 샘플 데이터를 단순화하고, 나중에 TempExampletable2

create table #team_table 
    (
     Team char(6) not null 
    ) 

insert into #team_table 
values ('Team 1') 
    , ('Team 2') 
    , ('Team 3') 
    , ('Team 4') 

대답에 나타난 매치업 만들

:

create table #matchups 
    (
     Home char(6) not null 
     , Away char(6) not null 
    ) 

create table #schedule 
    (
     Home char(6) not null 
     , Away char(6) not null 
     , Playing datetime not null 
    ) 

insert into #matchups 
select h.Team as Home 
, a.Team as Away 
from #team_table as h 
cross join #team_table as a 
where 1=1 
and h.Team <> a.Team 

declare @bgn_dt datetime = '2017-12-01 17:30:00' 
    , @tm_cnt int = (select count(*) from #team_table) 
    , @i int = 1 
    , @j int 
    , @j_max int 
    , @wk_cnt int 
    , @rnd int 
    , @cur_dt datetime; 

set @wk_cnt = ((@tm_cnt * (@tm_cnt - 1))/2) 

set @j_max = (@tm_cnt/2) --games in a week 

while @i <= @wk_cnt 
begin --while i 

    set @cur_dt = dateadd(d, 7 * (@i - 1), @bgn_dt) 

    set @j = 1 

    while @j <= @j_max 
    begin 

     ; with sched_teams as 
      (
       select s.Home as Team 
       from #schedule as s 
       where 1=1 
       and s.Playing = @cur_dt 
       union all 
       select s.Away as Team 
       from #schedule as s 
       where 1=1 
       and s.Playing = @cur_dt   
      ) 
     insert into #schedule 
     select top 1 m.Home 
     , m.Away 
     , @cur_dt as Playing 
     from #matchups as m 
     left join sched_teams as sh on m.Home = sh.Team --same team can't play 2 games in a single week 
     left join sched_teams as sa on m.Away = sa.Team --same team can't play 2 games in a single week 
     left join #schedule as s on m.Home = s.Home --can't play the same matchup twice 
           and m.Away = s.Away 
     where 1=1 
     and sh.Team is Null 
     and sa.Team is Null 
     and s.Home is Null 
     and s.Away is Null 
     order by m.Home asc 
     , m.Away asc 

     set @j += 1 

    end 

    set @i += 1 

end --while i 

select * 
from #schedule 
order by Home 
, Away 
을 샘플 데이터

order byinsert...select 문은 출력이 TempExampletable에 지정된 예상 출력과 동일하도록 강제합니다.