Можно ли повторить этот код N раз? - PullRequest
1 голос
/ 28 марта 2019

У меня есть таблица ABC, которая имеет 10M + строк.Он содержит customer_id, адрес электронной почты, счет.Я создал запрос, который случайным образом выбирает 1000 номеров и считает их по группам.Выходные данные для этого запроса приведены ниже.

RANDOM_GROUP    FREQ
1            71
2            45
3            35
4            45
5            53
6            40
7            65
8            54
9            68
10           59
11           465

Это мой запрос:

select random_group, count(random_group) as freq
from
      (select case when rand_num >= 0 and rand_num<=0.053 then 1
                  when rand_num > 0.053 and rand_num <= 0.097 then 2
                  when rand_num > 0.097 and rand_num <= 0.142 then 3
                  when rand_num > 0.142 and rand_num <= 0.189 then 4
                  when rand_num > 0.189 and rand_num <= 0.234 then 5
                  when rand_num > 0.234 and rand_num <= 0.281 then 6
                  when rand_num > 0.281 and rand_num <= 0.341 then 7
                  when rand_num > 0.341 and rand_num <= 0.399 then 8
                  when rand_num > 0.399 and rand_num <= 0.458 then 9
                  when rand_num > 0.458 and rand_num <= 0.515 then 10
                  when rand_num > 0.515 and rand_num <= 1.000 then 11 end 
                  random_group
      from
            (SELECT dbms_random.value(0,1) AS rand_num, 
                    rownum as at_row_num
             FROM ABC                   
             WHERE rownum <= 1000))
group by random_group
order by random_group
; 

Можно ли повторить этот запрос N раз, чтобы каждый вывод генерировал различное число?Должен ли я использовать петлю?Я не хочу запускать N раз вручную, чтобы получить разные результаты ... Спасибо!

1 Ответ

0 голосов
/ 28 марта 2019

Попробуйте следующий запрос: это ваш запрос, но он немного изменен для целей тестирования (он не использует таблицу ABC и генерирует только 10 строк, используя предложение CONNECT BY LEVEL <= 10, но вы можете заменить 10 на 1000)

WITH My_Query As (
        select random_group, count(random_group) as freq
        from
              (select case when rand_num >= 0 and rand_num<=0.053 then 1
                          when rand_num > 0.053 and rand_num <= 0.097 then 2
                          when rand_num > 0.097 and rand_num <= 0.142 then 3
                          when rand_num > 0.142 and rand_num <= 0.189 then 4
                          when rand_num > 0.189 and rand_num <= 0.234 then 5
                          when rand_num > 0.234 and rand_num <= 0.281 then 6
                          when rand_num > 0.281 and rand_num <= 0.341 then 7
                          when rand_num > 0.341 and rand_num <= 0.399 then 8
                          when rand_num > 0.399 and rand_num <= 0.458 then 9
                          when rand_num > 0.458 and rand_num <= 0.515 then 10
                          when rand_num > 0.515 and rand_num <= 1.000 then 11 end 
                          random_group
              from
                    (SELECT dbms_random.value(0,1) AS rand_num, 
                            rownum as at_row_num
                     FROM dual
                     CONNECT BY LEVEL <= 10))
        group by random_group
        order by random_group
)
SELECT * FROM (
        SELECT level as test_number FROM dual
        CONNECT BY LEVEL <= 100
) row_generator,
LATERAL (
    SELECT * FROM My_Query WHERE row_generator.test_number = row_generator.test_number
) x
; 

Кстати: этот пункт WHERE row_generator.test_number = row_generator.test_number представляется излишним, но без этого вы получите неправильные результаты - одни и те же записи повторяются 100 раз вместо случайных данных для каждого теста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...