在匹配夹具敲除中排列Byes(切换行值)SQL

时间:2017-10-21 11:07:01

标签: sql sql-server tsql

好的,我对SQL很新,所以我可能会离开这里,但这就是我想做的事情。我有TblFixtures,其中包含Guid的玩家,他们被吸引到Pool Knockout中互相玩耍。 tblFixtures有uniqueidentifier列player1和player2。我已经添加了#Byes&#39;因为像这样的淘汰赛所需的总球员是8 ..所以例如,如果在tblFixtures中只有6名球员,那么它会增加2个空白球员和Guid of 000000000000-0000-0000 000000000000&#39 ;.因此,2名玩家将获得下一轮的免费通行证(A&#39;再见&#39;)但是我需要重新安排该表,以防BYE最终被这样的BYE所吸引。< / p>

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&#39s的Guid。如果找到它,那么它会将此行中的Player1替换为它找到的下一个空白播放器1 Guid并将其替换为零。

我只是不了解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()=@cnt) = '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()=@cnt
            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

1 个答案:

答案 0 :(得分:1)

我会在此过程中更早解决这个问题。

假设你有下表

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;

而不是生成您需要修复的无效内容。