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 日が発生するはずです。これが最小のバケットになるため、10 個のバケットが必要です。2 日は 3 つのバケットに入ります。他の値は、それぞれ 2 つのバケットに入ります。次に、モジュロを使用して、次のように 10 個のバケットから 1 つを選択します。

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