0

我正在尝试编写一个存储过程,它将获取一张用户表并将它们随机分配给彼此,没有重复,也没有人分配给自己。

user 表有一个 UserId 列和一个 Username 列。我有一个单独的表来存储 ID。该表有一个 UserId 列和一个 AssignedUserId 列。

我使用这个片段来随机排序行:

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

当上面的代码是选择的一部分时,它可以正常工作。我只是很难以数据集的形式思考。我可以逐行或在 C# 中解决问题,但我希望有一位 SQL 大师可以向我展示如何在一个漂亮、高效的查询中做到这一点。

谢谢!

4

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
于 2012-12-14T15:27:00.263 回答
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
于 2012-12-13T19:06:20.517 回答