Обновить 25 % от общего числа строк, возвращаемых запросом выбора

Я должен вставить данные в таблицу со столбцами (столбец 1, столбец 2, столбец 3) .

У меня есть запрос на выбор, чтобы выбрать данные для вставки в эту таблицу.

Select A.id, b.id , '1' 
from table a 
inner join table b on a.id=b.id
where a.col= 'somevalue'and b.col ='othervalue'  ...

Если вы заметили третий столбец в выбранном отчете, у меня есть жестко закодированное значение "1". Текущее требование состоит в том, чтобы установить только 25 % от общего числа строк с "1", а остальные 75 % с "0". Теперь сложная часть состоит в том, что мы не можем быть уверены, сколько строк придет в операторе select. Мы также можем использовать оператор update, чтобы обновить 25 % строк значением 1, а остальные оставить его равным "0", но функция ограничения не будет принимать любую пользовательскую переменную.

Кто-нибудь может предложить что-то по этому поводу?

Я использую MYSQL

2 ответа

Решение

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

insert into . . .
    select a_id, b_id, (mod(rn, 4) = 0) as flag
    from (Select A.id as a_id, b.id as b_id , (@rn := @rn + 1) as rn
          from table a inner join
               table b
               on a.id = b.id cross join
               (select @rn := 0) vars
          where a.col = 'somevalue' and b.col = 'othervalue'  ...
         ) i;

Хорошей особенностью каждого четвертого ряда является то, что это работает хорошо, даже если данные упорядочены из-за join,

Используйте подзапрос, чтобы получить общее количество строк. Затем используйте пользовательскую переменную, чтобы получить номер строки в выходных данных, и сравните его с 25% от общего числа.

SELECT a.id, b.id, IF(@counter < pct25, '1', '0'), @counter := @counter + 1
FROM table1 a
JOIN table2 b ON a.id = b.id
JOIN (SELECT COUNT(*)/25 AS pct25
      FROM table1 a
      JOIN table2 b ON a.id = b.id) AS x
CROSS JOIN (SELECT @counter := 0) AS var
Другие вопросы по тегам