我有一個由不同所有者擁有的用戶表。剩下一個人,用戶串列需要在兩個所有者之間拆分。您將如何使用 SQL 在兩個 ownerIds 之間隨機分配用戶。例如,理論上行為如下的函式
UPDATE Users
set OwnerId = RAND(64,72)
Where OwnerId = 37
我們正在使用 SQL Server 2012。嘗試查看兩個用戶之間的隨機函式,但找不到任何特定的東西。謝謝,
uj5u.com熱心網友回復:
您可以使用CHECKSUM(NEWID())which 回傳一個奇數或偶數的整數,因此只需檢查 mod 2 ( % 2)。
UPDATE dbo.Users
SET OwnerId = CASE
WHEN CHECKSUM(NEWID()) % 2 = 0 THEN 64 ELSE 72 END
WHERE OwnerId = 37;
這個小提琴中的作業示例。
如果您想變得神秘/聰明或打代碼高爾夫,那么在這個非常具體的示例中可以使用類似的方法:
UPDATE dbo.Users
SET OwnerId = 64 (CHECKSUM(NEWID()) % 2 * 8)
WHERE OwnerId = 37;
這比它作業得更好的原因RAND()是因為RAND()只評估一次,而NEWID()對每一行進行評估。
不過,按照Larnu 的建議,您也可以這樣做:
WITH cte AS
(
SELECT ID, OwnerId, rn = ROW_NUMBER() OVER (ORDER BY ID)
FROM dbo.Users
WHERE OwnerId = 37
)
UPDATE cte SET OwnerId = 64 (rn % 2 * 8);
這個小提琴中的作業示例。這將產生更均勻(但可能過于可預測)的分布,即使存在奇數個現有匹配行,它也不能完全準確。
uj5u.com熱心網友回復:
首先讓我們討論如何提供示例資料。一種更好的方法是提供 SQL 來定義一個物件,然后用資料填充它。在你的情況下,這樣的事情會很有用:
DECLARE @users TABLE (UserID INT, OwnerID INT)
INSERT INTO @users (UserID, OwnerID) VALUES
(1, 100),(2, 100),(3, 100),(4, 100),(5, 100),(6, 100),(7, 100),(8, 100),(9, 100),(10, 100)
現在我們可以使用它來提供演示。如果你真的想在兩個用戶之間隨機分配,那就有點復雜了。要在兩個新所有者之間平均分配用戶,您可以執行以下操作
SELECT *, CASE WHEN UserID % 2 = 0 THEN 101 ELSE 102 END AS NewOwner
FROM @users
我們在這里所做的只是找到 UserID 的模以查找它為 0。如果 userID 可以被 2 整除,則所有者 101 獲取用戶,否則所有者 102 獲取用戶。
UserID OwnerID NewOwner
------------------------
1 100 102
2 100 101
3 100 102
4 100 101
5 100 102
6 100 101
7 100 102
8 100 101
9 100 102
10 100 101
如果要在更多用戶之間拆分,請增加模數并提供更多 WHEN 選項:
SELECT *, CASE WHEN UserID % 3 = 0 THEN 101
WHEN UserID % 3 = 1 THEN 102
ELSE 103 END AS NewOwner
FROM @users
UserID OwnerID NewOwner
------------------------
1 100 102
2 100 103
3 100 101
4 100 102
5 100 103
6 100 101
7 100 102
8 100 103
9 100 101
10 100 102
為了使分割實際上是隨機的,我們可以利用 RAND 函式。這通常不是每行隨機的,但我們可以稍微欺負一下。
SELECT *, CASE WHEN (ROUND(((3 - 1 -1) * RAND(CAST(NEWID() AS VARBINARY)) 1), 0) - 1) = 0 THEN 101 ELSE 102 END AS NewOwner
FROM @users
UserID OwnerID NewOwner
1 100 101
2 100 101
3 100 101
4 100 102
5 100 102
6 100 101
7 100 102
8 100 101
9 100 102
10 100 102
我們可以像這樣添加額外的值:(注意額外的 WHEN 和隨機序列范圍增加到 4)
SELECT *, CASE WHEN (ROUND(((4 - 1 -1) * RAND(CAST(NEWID() AS VARBINARY)) 1), 0) - 1) = 0 THEN 101
WHEN (ROUND(((4 - 1 -1) * RAND(CAST(NEWID() AS VARBINARY)) 1), 0) - 1) = 1 THEN 102
ELSE 103 END AS NewOwner
FROM @users
UserID OwnerID NewOwner
------------------------
1 100 102
2 100 103
3 100 101
4 100 101
5 100 101
6 100 103
7 100 102
8 100 103
9 100 103
10 100 103
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/528461.html
上一篇:如何使用SQLServer中的觸發器檢查一個表的id是否存在于另一個表中?
下一篇:火星之旅受阻
