填写抵达日期之后的出发日期字段

时间:2013-02-20 14:12:08

标签: sql-server tsql

第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

2 个答案:

答案 0 :(得分:0)

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

要获得解决方案,您需要创建可能值的“存储桶”。 10%的情况应该发生3天;这是最小的水桶,所以我们需要十个水桶。 2天进入3个桶。其他值分别为2个桶。然后只需使用modulo选择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

编辑:更新了不使用案例陈述的代码。

答案 1 :(得分: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) 

由于

韦恩