21

ランダムに選択されたテーブルの行の50%を更新したいと思います。それを行う方法はありますか?

編集:レコードの50%を常に更新する必要があることを明確にするために、それらの50%のうち、行をランダムに選択する必要があります(たとえば、上位50%だけではありません)。つまり、平均では、他のすべてのレコードを更新する必要があります。

4

4 に答える 4

42

そのように動作するはずです:

UPDATE table SET x = y WHERE RAND() < 0.5

うん、それをテストし、動作します。もちろん、それは平均で行の 50% にすぎず、正確に 50% ではありません。

SQL 92 仕様に記述されているように、WHERE句はタプルごとに実行するrand()必要があるため、(すべての行を選択するか、行をまったく選択しないのではなく) を再評価して、意図した結果を得る必要があります。

仕様からの抜粋 (強調鉱山):

一般的なルール

1)<search condition>は T の各行に適用されます。 の結果は、結果が真<where clause>である T の行のテーブルです。<search condition>

2)<subquery>内の各は、<search condition> T の各行に対して効果的に実行され、結果は T<search condition>の指定された行への の適用に使用されます。実行されたいずれか <subquery>が T の列への外部参照を含む場合、参照は の値です。 T の指定された行のその列。

于 2012-06-18T16:30:54.227 に答える
7

私が言ったように、それは長い道のりであり、一種の疑似コードで記述されています。)

$x = SELECT COUNT(*) FROM some_table;
@ids = SELECT id FROM some_table ORDER BY RAND() LIMIT $x / 2;
UPDATE some_table WHERE id IN (@ids);
于 2012-06-18T16:38:40.370 に答える
0

RANDランダムにする必要があり、確実なパーセンタイル分割は得られません。

モジュラス演算子を使用して、%X 個の項目ごとに検索する方がよいでしょう。これは、主キーのような一意の ID 列で最適に機能します。

このクエリを実行してみてください。必ずテーブル名と id 列名を指定してください。

2 で割り切れる 2 行ごとに選択する SELECT * from <your_table_name> where <id_column_name> %2=0

6 で割り切れる 6 行ごとに選択 SELECT * from <your_table_name> where <id_column_name> %6=0

結果が良好に見えることに満足したら、同じ句SELECTを使用して更新構文を使用してクエリを変更し、レコードを更新できます。WHERE

于 2016-11-24T05:03:58.760 に答える
0

UPDATE table SET volumnvalue = x WHERE RAND() <= 0.5 の場合、レコードの 50% 近くになります。

于 2012-08-21T11:23:47.513 に答える