2012-12-13 58 views
0

我正在嘗試編寫一個存儲過程,它將把用戶的表格分配給對方,並將它們隨機分配給對方,而不會有重複,也沒有人分配給自己。如何在T-SQL中隨機分配一個用戶到另一個用戶?

用戶表具有UserId列和Username列。我有一個單獨的表來存儲這些ID。該表具有UserId列和AssignedUserId列。

我使用此代碼段,用於隨機排序行:

SELECT ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) AS [RandomNumber] 

當上面的代碼是一個選擇的一部分,它工作正常。我只是很難把它當成一個數據集。我可以逐行或在C#中處理問題,但是我希望有一位SQL大師能夠告訴我如何在一個不錯的高效查詢中完成此操作。

謝謝!

+0

定義沒有重複。你想分配(更新)AssignedUserId列? – Paparazzi

+0

可能的重複[如何從表中隨機選擇唯一行對]?(http://stackoverflow.com/questions/4823208/how-do-i-select-unique-pairs-of-rows-from -a-table-at-random) – Pondlife

+0

對於沒有蠢話,我的意思是每個配對應該是唯一的,沒有人應該被分配給自己。 –

回答

0

它可以做到,但在大型桌子上不是很好的做法,但是如果桌子太小,這將工作得很好。

DECLARE @A TABLE (A1 INT, A2 INT) 

INSERT INTO @A VALUES(1, 1) 
INSERT INTO @A VALUES(2, 2) 
INSERT INTO @A VALUES(3, 3) 
INSERT INTO @A VALUES(4, 4) 
INSERT INTO @A VALUES(5, 5) 

SELECT * FROM @A ORDER BY NEWID() 

Result1: 
3 3 
1 1 
4 4 
5 5 
2 2 

Result2: 
2 2 
3 3 
4 4 
5 5 
1 1 

Result3: 
4 4 
3 3 
1 1 
5 5 
2 2 

Result4: 
3 3 
5 5 
1 1 
4 4 
2 2 

Result5: 
5 5 
4 4 
1 1 
3 3 
2 2 
+0

如果系統今天上線,那麼應該有不到100個用戶。這是一個內部應用程序。使用NEWID()我選擇的選擇。我無法將自己或臨時表或其他任何東西加入表中,並讓服務器找出這些對。 –

+0

你可以發佈樣本嗎? Order By NewID()應該適用於如此少量的數據。什麼是隨機排列每列,即使你有兩列。 – Switch

+0

我正在尋找像這樣的結果:1 - 3,2 - 4,9 - 7,但不是3 - 3或1 - 2,3 - 2(2不應配對兩次)。 –

0

好的,這是我在此期間提出的另一種解決方案。我決定用戶已經以隨機順序在系統中,所以也許我應該嘗試一種解碼器環式的方法。因此,此代碼會生成一個移位值,然後移動用戶ID。 select語句用公式「繞回」。這不是完全隨機的,它可以使用一些波蘭語,但這是我的。用戶可能不會察覺到隨機性的缺乏。謝謝您的幫助!

DECLARE @people TABLE 
( 
    id INT, 
    name VARCHAR(50) 
) 

INSERT INTO @people VALUES (1,'Matthew') 
INSERT INTO @people VALUES (2,'Mark') 
INSERT INTO @people VALUES (3,'Luke') 
INSERT INTO @people VALUES (4,'John') 
INSERT INTO @people VALUES (5,'Doug') 
INSERT INTO @people VALUES (6,'Jamie') 
INSERT INTO @people VALUES (7,'John') 
INSERT INTO @people VALUES (8,'Cameron') 
INSERT INTO @people VALUES (9,'Emily') 
INSERT INTO @people VALUES (10,'Tyler') 
INSERT INTO @people VALUES (11,'Todd') 
INSERT INTO @people VALUES (12,'Kathryn') 

DECLARE @Random INT; 
DECLARE @Upper INT; 
DECLARE @Lower INT; 
DECLARE @MaxId INT; 

SET @Lower = 1 -- The lowest record ID 

SELECT @Upper = (MAX(Id)/2) FROM @people -- select random int that is somewhere between 1 and half of max ID for shift 
SELECT @MaxId = MAX(Id) FROM @people -- select the largest ID in the table 

SELECT @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0) -- calculate a random number to shift IDs off by 

SELECT id, ((id + @Random) % @MaxId) + 1, @Random 
from @people 
+0

我不確定你是否打算這樣做,但你只是隨機挑選組的上半部分。如果你想隨機化每個人,「Upper-Lower-1」應該只是Upper。 – Switch

相關問題