Обновить 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