Попытка замены при l oop, которая выполняется на основе значения в строке из представления в запросе Set - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь создать запрос, который выдаст мне случайные строки из представления (view_XYZ) на основе значения в SampleSizeByRow (в view_SampleSizeByRow), а затем вставит случайное значение из view_XYZ в tbl_Randomization.

view_SampleSizeByRow выглядит как

ID_x    SampleSizeByRow
49      1
87      1
47      6
41      2
247     13
96      3
99      1
31      1
91      13
DECLARE @CurrSize AS INT
DECLARE @CurrID AS INT
DECLARE @SampleByValTbl AS TABLE(   
    Samplesize INT,
    ID INT
    )

INSERT INTO @SampleByValTbl (
    Samplesize
    , ID
    )
SELECT SampleSizeByRow, ID_x
FROM view_SampleSizeByRow
ORDER BY ID_x;

WHILE(1=1) -- Infinite Loop until it is broken
BEGIN
    SET @CurrID = NULL  -- Reset pointer variables
    SET @CurrSize = NULL

    SELECT TOP(1) @CurrID = ID
    FROM @SampleByValTbl 

    SELECT TOP(1) @CurrSize = Samplesize
    FROM @SampleByValTbl 

    IF (@CurrID IS NULL OR @CurrSize IS NULL)   -- End loop if there are no ID's to go through
        BREAK

    IF @CurrSize <= 0
    BEGIN
        DELETE TOP(1) FROM @SampleByValTbl 
        CONTINUE
    END
    ELSE
    BEGIN
        WHILE @CurrSize > 0
        BEGIN
            INSERT INTO tbl_Randomization (
                ID_x
                , Num_y
                )
            SELECT TOP(1) ID_x
                            , Num_y
            FROM view_XYZ
            ORDER BY NEWID()    -- Random Selection

            SET @CurrSize = @CurrSize - 1

        END

        DELETE TOP(1) FROM @SampleByValTbl -- To shorten the size of the table each time we parse through it
    END
END

Результаты должны быть примерно такими, как в таблице ниже

ID_x  Num_y
41  4888084
41  4895898
46  4889509
46  4889493
47  4891612
47  4898679
47  4889485
47  4902432
49  4893435
91  4898447
91  4898892
91  4895738
91  4888350
91  4898920
91  4886422
91  4899137
91  4895741
91  4886918
91  4894146
91  4888301
91  4888383
91  4882095
91  4898402
96  4893927
96  4893738
96  4887504
99  4893713
247 4897332
247 4902343
247 4897769
247 4895529
247 4885333
247 4895512
247 4895488
247 4885279
247 4893031
247 4891872
247 4896523
247 4901417
247 4885181
247 4897541
...

Я пытался использовать CTE и различные объединения, но я могу не понимаю, как их кодировать, чтобы они возвращали одинаковые результаты.

1 Ответ

0 голосов
/ 27 марта 2020

Если I правильно следовал за вами, вы хотите выбрать sample_size случайные значения из view_XYZ для каждого id_x, указанного в view_SampleSizeByRow.

Вот подход, который использует рекурсивный запрос для генерации строк, а затем коррелированный подзапрос для получения случайного значения:

with cte as (
    select id_x, sample_size - 1 from view_SampleSizeByRow where sample_size > 0
    union all
    select id_x, sample_size - 1 from cte where sample_size > 0
)
insert into tbl_Randomization (id_x, num_y)
select 
    id_x,
    (select top (1) num_y from view_XYZ v where v.id_x = c.id_x order by newid())
from cte c
...