2011-03-15 102 views
0

我有一個t-sql程序生成的測試數據並作爲其中的一部分,需要幾列是隨機設定爲以下一個預定分配一組值。我現在有這樣做的使用標識列,其餘操作符%的方法,但我想知道是否有設計一個解決這個問題,讓我進行參數的列分配的值和分佈的更優雅的方式。分配值,以隨機的記錄基於給定分佈

例如,

我要指派三個值{Horse, Donkey, Pony}Column A一個和兩個值{Big, Small}column B之一。在這種情況下,我想分佈相等,{Horse:1/3, Donkey 1/3, Pony, 1/3}, {Big:1/2, Small:1/2}Column B's分佈應取決於Column A(即小馬的1/2應大)

Record | ColumnA | ColumnB | OtherData 
1 | Horse | Big |... 
2 | Horse | Small |... 
3 | Donkey | Big |... 
4 | Donkey | Small |... 
5 | Pony | Big |... 
6 | Pony | Small |... 

我寧願柱的半隨機分配A和B關於記錄號碼,但這不是必需的。

在分佈是不完全可能的情況下,所有剩餘的記錄應分配的可能值之一。假設在大型數據集中,這將會自行解決。

回答

0

不知道這是否會在你的情況有所幫助,但是這將SQL Server的2005+上工作。這是一組300個記錄,每隻動物產生100只,每隻動物每隻大小50只。

有可能是在其他SQL語言來處理這個類似的方式。

DECLARE @MaxCount INT 
SET @MaxCount = 300 

SET NOCOUNT ON; 
DECLARE @Numbers TABLE (Number INT NOT NULL IDENTITY); 
INSERT @Numbers DEFAULT VALUES; 
WHILE SCOPE_IDENTITY() < @MaxCount INSERT @Numbers DEFAULT VALUES; 

SELECT * 
FROM (
    SELECT RandomSize.Number 
    , RandomSize.Animal 
    , CASE RandomSize.RowNumber % 2 
      WHEN 0 THEN 'Big' 
      WHEN 1 THEN 'Small' 
     END Size 
    FROM (
     SELECT DerivedAnimal.Number 
     , DerivedAnimal.Animal 
     , ROW_NUMBER() OVER (PARTITION BY DerivedAnimal.Animal ORDER BY NEWID()) RowNumber 
     FROM (
      SELECT RandomAnimals.Number 
      , CASE RandomAnimals.RowNumber % 3 
        WHEN 0 THEN 'Horse' 
        WHEN 1 THEN 'Donkey' 
        WHEN 2 THEN 'Pony' 
       END Animal 
      FROM (
       SELECT Number 
       , ROW_NUMBER() OVER (ORDER BY NEWID()) RowNumber 
       FROM @Numbers 
       ) RandomAnimals 
      ) DerivedAnimal 
     ) RandomSize 
    ) FinalList 
ORDER BY FinalList.Number