安排在比赛夹具淘汰赛中的Bye(切换行值)SQL

安排在比赛夹具淘汰赛中的Bye(切换行值)SQL

问题描述:

好吧,我是相当新的SQL,所以我可能离开这里,但这是我想要做的。我有tblFixtures,其中持有Guid's的选手,他们已经被吸引到Pool Knockout中玩对方。 tblFixtures具有唯一标识符列player1和player2。我已经添加了'Byes',因为这样的淘汰赛需要的总人数是8 ..例如,如果tblFixtures中只有6名玩家,则会添加2个空白玩家,其中Guid为'00000000-0000-0000-0000- 000000000000' 。因此,2名球员将获得'下一轮*传球(A'Bye'),但是我需要重新安排表格,以防BYE像这样结束BYE。安排在比赛夹具淘汰赛中的Bye(切换行值)SQL

Player 1         Player 2 
{72462373-6B64-4427-9F9F-9A872261A333} v {9C90B324-78CA-4C7B-BC79-15537F3935B2} 
{00000000-0000-0000-0000-000000000000} v {00000000-0000-0000-0000-000000000000} 
{3E828BB1-AEC2-4543-BD26-E12AD886D2E8} v {72462373-6B64-4427-9F9F-9A872261ABC2} 
{4F9C3964-2672-4413-8A01-2ED09CA7A711} v {AFEB20EB-5CCB-4302-A999-CC772F8ABACE} 

我需要它把空的GUID对一个球员的GUID中像这样..

Player 1         Player 2 
{72462373-6B64-4427-9F9F-9A872261A333} v {9C90B324-78CA-4C7B-BC79-15537F3935B2} 
{3E828BB1-AEC2-4543-BD26-E12AD886D2E8} v {00000000-0000-0000-0000-000000000000} 
{00000000-0000-0000-0000-000000000000} v {72462373-6B64-4427-9F9F-9A872261ABC2} 
{4F9C3964-2672-4413-8A01-2ED09CA7A711} v {AFEB20EB-5CCB-4302-A999-CC772F8ABACE} 

下面的代码需要OVER命令和一些调整,我认为,但这是尽可能我可以得到。我试图做的是检查有多少玩家(包括BYES),因此在这种情况下有8个,并存储在@matches中。现在我希望它一次检查一行,使用等于存储在@matches中的数量的循环。此检查查找空白0的Guid播放空白0的Guid。如果找到了,那么它会用下一个没有的空白player1代替这一行中的Player1,并找出它并将其置零。

我只是不知道理解OVER还没有确定其余的代码将实际工作或有没有人知道一个更简单的方法来做到这一点?

任何帮助表示赞赏。这是我到目前为止..

DECLARE @matchess int 
SELECT @matches = COUNT(accountID) from tblFixtures)* 

DECLARE @cnt INT = 0 

WHILE @cnt < @matches 
    BEGIN 
    If (SELECT Player1 FROM tblFixtures WHERE ROW_NUMBER()[email protected]) = '00000000-0000-0000-0000-000000000000' AND SELECT(player1 FROM tblFixtures WHERE ROW_NUMBER()= @cnt) ='00000000-0000-0000-0000-000000000000' THEN 
     BEGIN 
      UPDATE tblFixtures SET Player1 = SELECT(TOP(1) player1 FROM tblFixtures WHERE player1 <> '00000000-0000-0000-0000-000000000000' AND ROW_NUMBER()>@cnt) WHERE ROW_NUMBERr()[email protected] 
      UPDATE tblFixtures SET Player1 = '0000-0000-0000-0000' WHERE SELECT(Top(1) player1) <> '00000000-0000-0000-0000-000000000000' AND ROW_NUMBER()>@cnt 
     END 
    SET @cnt = @cnt + 1 
END 
+0

需要做到这一点有点混乱。我会首先更改生成这些行的代码,以避免再见的可能性。例如,你有6名队员和2名队员。给玩家一个插槽1..4和玩家两个插槽5..8。预留第7和8号插槽。随机对6名玩家进行排序并分配到1..6插槽。 –

+0

如果有5名球员,你会有2个对手,而有3个是前进对阵再见?如果这是你想要的,那么仅仅在一侧添加脚趾就足够了? – Shnugo

+0

在这个阶段之前添加了正确数量的Bye,并且所有的东西都可以工作,而我只需要在两个Bye彼此相对的情况下切换它。如果您可以建议一种方法来做到这一点,我感谢您的帮助? –

我会在此过程中解决此问题。

假设你有如下表

CREATE TABLE Players(Player UNIQUEIDENTIFIER); 

INSERT INTO Players 
SELECT '{72462373-6B64-4427-9F9F-9A872261A333}' UNION ALL 
SELECT '{3E828BB1-AEC2-4543-BD26-E12AD886D2E8}' UNION ALL 
SELECT '{4F9C3964-2672-4413-8A01-2ED09CA7A711}' UNION ALL 
SELECT '{9C90B324-78CA-4C7B-BC79-15537F3935B2}' UNION ALL 
SELECT '{72462373-6B64-4427-9F9F-9A872261ABC2}' UNION ALL 
SELECT '{AFEB20EB-5CCB-4302-A999-CC772F8ABACE}'; 

您可以使用以下方法来生成唯一有效的联系(demo

WITH T AS 
(
SELECT *, 
     ROW_NUMBER() OVER (ORDER BY CRYPT_GEN_RANDOM(4)) AS Rn, 
     ceiling(power(2, ceiling(log(COUNT(*) OVER())/log(2)))/2.0) AS MatchCount 
FROM Players 
) 

SELECT MAX(CASE WHEN Rn <= MatchCount THEN Player END), 
     ISNULL(MAX(CASE WHEN Rn > MatchCount THEN Player END), 
      '{00000000-0000-0000-0000-000000000000}') 
FROM T 
GROUP BY Rn%MatchCount; 

,而不是生成无效的,你则需要修正了。

+0

哇,令人印象深刻!我无法理解其中的很多,但基本上我是从tblEntrants中拿球员并想将它们存储在tblFixtures下,名称为player1和player2。如果你能以某种方式告诉我如何存储它们,我很乐意使用它在tblFixtures。非常感谢你的帮助。 –

+0

只需在第二个“选择”之前立即添加“INSERT INTO tblFixtures(Player1,Player2)”即可。 –

+0

您是天才!这完美地工作,正是我需要的。我会研究试着弄清楚它是如何工作的。非常感谢。 –