2017-04-17 4 views
0

偶数のチームの名前を持つテーブルを用意し、トーナメントのスケジュールを生成する必要があります。つまり、チーム1、チーム2、チーム3、チーム4の4つのチームSQL Serverでトーナメントスケジュールを生成する

Team Team  Round 
----------------------- 
team1 team2 1 
team 3 team4 1 
team1 team3 2 
team2 team4 2 
team1 team4 3 
team2 team3 3 

これはT-SQLを使用して行う必要があります。 Round Robin Tournamentアルゴリズムを試してみましたが、T-SQLで実装する方法がわかりません。

答えて

0

誰もこれに答えを与えていないと見て、私は私もあなたに、動的SQLでこれを行うには(おそらく非効率的な)方法を1が表示される場合があります図:

DECLARE @SQL NVARCHAR(MAX) = N''; 
SELECT TOP (SELECT CASE COUNT(*) % 2 WHEN 1 THEN COUNT(*) ELSE COUNT(*) - 1 END FROM dbo.Teams) @SQL += N' UNION ALL 
SELECT * 
FROM 
(
    SELECT TOP (SELECT COUNT(*)/2 FROM T) 
     Team, 
     RN, 
     RoundNum = ' + CAST(N AS NVARCHAR(3)) + N', 
     Match = ROW_NUMBER() OVER (ORDER BY CASE WHEN RN = 1 THEN 0 ELSE 1 END, (RN + ' + CAST(N - 2 AS NVARCHAR(3)) + N') % (SELECT COUNT(*) FROM T)), 
     Slot = 1 
    FROM T 
    ORDER BY CASE WHEN RN = 1 THEN 0 ELSE 1 END, (RN + ' + CAST(N - 2 AS NVARCHAR(3)) + N') % (SELECT COUNT(*) FROM T) 
    UNION ALL 
    SELECT TOP (SELECT COUNT(*)/2 FROM T) 
     Team, 
     RN, 
     RoundNum = ' + CAST(N AS NVARCHAR(3)) + N', 
     Match = ROW_NUMBER() OVER (ORDER BY CASE WHEN RN = 1 THEN 1 ELSE 0 END, (RN + ' + CAST(N - 2 AS NVARCHAR(3)) + N') % (SELECT COUNT(*) FROM T) DESC), 
     Slot = 2 
    FROM T 
    ORDER BY CASE WHEN RN = 1 THEN 1 ELSE 0 END, (RN + ' + CAST(N - 2 AS NVARCHAR(3)) + N') % (SELECT COUNT(*) FROM T) DESC 
) AS T 
' 
FROM (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM sys.objects) T(N) 
ORDER BY N; 

SELECT @SQL = N' 
WITH T AS 
(
    SELECT Team, RN = ROW_NUMBER() OVER (ORDER BY Team) 
    FROM dbo.Teams 
    UNION ALL 
    SELECT ''Bye'', COUNT(*) + 1 
    FROM dbo.Teams 
    HAVING COUNT(*) % 2 = 1 
), 
CTE2 AS 
(
' + STUFF(@SQL, 1, 11, '') + N' 
) 
SELECT T1.RoundNum, T1.Match, Team1 = T1.Team, Team2 = T2.Team 
FROM 
(
    SELECT * 
    FROM CTE2 
    WHERE Slot = 1 
) AS T1 JOIN 
(
    SELECT * 
    FROM CTE2 
    WHERE Slot = 2 
) AS T2 
    ON T2.RoundNum = T1.RoundNum 
    AND T2.Match = T1.Match;'; 


EXEC sp_executesql @SQL; 

基本的には、それがfix one of the contributors in the first or last column of the tableは説明しませんあなたのwikiリンクに1を据え、すべてのチームを1の周りにシフトさせてください。奇数チームの場合、それは「バイバイ」の対戦相手を追加します。そして、テーブルをNまたはN-1回(偶数または奇数のチームがあるかどうかに応じて)循環させるだけです。

関連する問題