Как генерировать выборочные данные на основе взвешенных базовых значений - PullRequest
0 голосов
/ 31 мая 2019

Используя SQL, мне нужно сгенерировать некоторые примерные данные из N строк на основе некоторых базовых значений, которым присвоены веса.

Например: если мои базовые значения и соответствующие им веса:

  • a-1,
  • b-2,
  • c-3,
  • d-4,
  • e-5

И если требуемый размер выборки равен 15, то возвращаемый набор строк должен иметь:

  • 5 строк по e,
  • 4 ряда по d,
  • 3 ряда по c,
  • 2 ряда по b.
  • и 1 строка

, всего 15 строк.

Ответы [ 2 ]

1 голос
/ 31 мая 2019

на сервере sql, вы можете использовать left,right, чтобы разделить значение, а затем использовать cte + recursion, чтобы получить несколько строк, и эта логика также является общей для других rdbms.

Таблица & DDL

|val|
|--- |
|a-1|
|b-2|
|c-3|
|d-4|
|e-5|

Запрос SQL

with cte as (
  select 
   left(val, CHARINDEX('-', val)-1)  id
   ,convert(int, right(val, CHARINDEX('-', val)-1 ))  cnt
  from t
)
,cte2 as (
  select T1.id,T1.cnt - 1 as cnt from cte T1
  union all
  select T1.id,T2.cnt - 1 as cnt from cte T1
  inner join cte2 T2 on T1.id = T2.id and T2.cnt > 0 
)
select id from cte2
order by id,cnt

демонстрационная ссылка онлайн | дб <> скрипка

0 голосов
/ 31 мая 2019

Вам нужен способ генерации строк, например таблица чисел.Предполагая, что у вас это есть, проблема тогда просто арифметическая (в основном).

Следующее работает отлично, если количество строк точно кратно сумме весов:

select *
from (select t.*, sum(weight) over () as sum_weight,
             sum(weight) over (order by rand()) as running_weight
      from t
     ) t join
     n
     on n.n % sum_weight >= running_weight - weight and
        n.n % sum_weight < running_weight
where n.n <= 15
order by value;

Здесь - это дБ <> скрипка.Скрипка использует SQL Server, но в основном это стандартный SQL.

...