Назначьте значения для записей случайным образом на основе заданных распределений - PullRequest
0 голосов
/ 15 марта 2011

У меня есть t-sql процедура, которая генерирует тестовые данные, и как часть этого, несколько столбцов должны быть случайным образом установлены в набор значений после предопределенного распределения.В настоящее время у меня есть метод для этого с использованием столбца идентификаторов и оператора остатка%, но мне было интересно, существует ли более элегантный способ разработки решения этой проблемы, который позволил бы мне параметризовать значения и распределение, которые назначены столбцам.

Например,

Я хочу присвоить Column A одно из трех значений {Horse, Donkey, Pony} и column B одно из двух значений {Big, Small}.В этом случае я хочу, чтобы распределения были равны, {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 по номерам записей, но это не является обязательным.

В случае, когда распределение не совсем возможно, всем оставшимся записям должно быть присвоено одно из возможных значений,Предполагается, что в больших наборах данных это будет работать само.

1 Ответ

0 голосов
/ 17 марта 2011

Не уверен, поможет ли это в вашем случае, но это будет работать на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...