0

步骤1

到达日期(已生成)– 135 万次

第2步

随机化 0 到 1 之间的数字

第 3 步

使用上面生成的随机数来创建下面的脚本

UPDATE BOOKINGS
SET DepartureDate
CASE WHEN RAND() Result = Between 0 and 0.3 = Departure Date will be 2 Nights Later 
CASE WHEN RAND() Result = Between 0.3 and 0.4 = Departure Date will be 3 Nights Later
CASE WHEN RAND ()Result >0.4 = Departure Date will be either 1,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28 Nights Later
4

2 回答 2

0

只是为了让您知道我使用的最终解决方案是:

UPDATE BOOKINGS 
SET DepartureDate = 
DATEADD(day, 
CASE WHEN Rand(CHECKSUM(NEWID())) BETWEEN 0 and 0.3 THEN 2 ELSE 
CASE WHEN Rand(CHECKSUM(NEWID())) BETWEEN 0.3 and 0.5 THEN 3 ELSE 
Round(Rand(CHECKSUM(NEWID())) * 28,0) END END,ArrivalDate) 

谢谢

韦恩

于 2013-02-21T10:02:51.873 回答
0

不要将 RAND() 与不断变化的种子一起使用。它产生了非常随机的数据。

要获得您的解决方案,您需要创建可能值的“桶”。10% 的情况下应该发生 3 天;这使得最小的桶,所以我们需要十个桶。2 天分为 3 个桶。其他值分别进入 2 个存储桶。然后只需使用模来选择 10 个存储桶之一,如下所示:

CREATE TABLE dbo.booking(Id INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,days INT);

GO

INSERT INTO dbo.booking(days)
SELECT TOP(100000) 0 FROM sys.columns A,sys.columns B,sys.columns C,sys.columns D;

GO


UPDATE b
 SET days = rndm.days
FROM dbo.booking b
CROSS APPLY (
  SELECT days
   FROM (VALUES(0,2),(1,2),(2,2),(3,3),(4,1),(5,1),(6,4),(7,4),(8,28),(9,28))dn(n,days)
   WHERE n = ABS(CHECKSUM(NEWID(),b.Id))%10
)rndm;

GO

SELECT days,COUNT(1) cnt
FROM dbo.booking
GROUP BY days;


GO

编辑:将代码更新为不使用 case 语句。

于 2013-02-20T14:38:41.443 回答