0

ユーザーのテーブルを取得し、それらを重複せずにランダムに割り当て、誰も自分自身に割り当てないsprocを作成しようとしています。

ユーザー テーブルには、UserId 列と Username 列があります。ID を格納するための別のテーブルがあります。そのテーブルには、UserId 列と AssignedUserId 列があります。

このスニペットを使用して、行をランダムに並べ替えました。

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

上記のコードが選択の一部である場合、正常に動作します。データセットとして考えるのに苦労しています。私は行単位または C# で問題を処理できますが、これを適切で効率的なクエリで実行する方法を教えてくれる SQL の第一人者がいることを願っています。

ありがとう!

4

2 に答える 2

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 に答える
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 に答える