他のテーブルへのいくつかのキーを含むテーブルがあります(各キーは複数の列で構成されています)。等しいキーを持つ行をグループ化したいのですが、それらすべてをグループ化したくありません。それは単純なGROUP BY
キーではなく、たとえば10のグループを作成できるようにしたいのです。したがって、特定のキーが50回表示された場合、このグループ化(5グループの10)を実行すると5つの結果が得られます。また、このグループ化をキー内でランダムに発生させます。
私はこれを行う直接的な方法を知りませんでした、そして私が思いついたラウンドアバウト方式は私が思っているように機能していません。私が思いついたラウンドアバウト交差点の解決策は、値がそのキーi
のith
出現を(ただしランダムな順序で)表すような整数である各キーの新しい列を作成することでした。次に、整数の除算を行って、キー内のすべてのn(たとえば10)行が同じ値になるようにし、GROUP BY
その値に対してa を行うことができます。
今説明したことを達成するためのより直接的な方法はありますか?これはかなり厄介で、新しいインデックス列を作成するときに問題が発生しました(この質問で説明したように)。
編集:まず、これはMySQL用であることに注意してください。目標が明確でない場合に備えて、例を追加します。MySQLのドキュメントはほとんどそこに到達する方法を示しています:
CREATE TABLE animals (
grp ENUM('fish','mammal','bird') NOT NULL,
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (grp,id)
) ENGINE=MyISAM;
INSERT INTO animals (grp,name) VALUES
('mammal','dog'),('mammal','cat'),
('bird','penguin'),('fish','lax'),('mammal','whale'),
('bird','ostrich');
SELECT * FROM animals ORDER BY grp,id;
これは、私が望むものではありませんが、近くなるテーブルを作成します:
+--------+----+---------+
| grp | id | name |
+--------+----+---------+
| fish | 1 | lax |
| mammal | 1 | dog |
| mammal | 2 | cat |
| mammal | 3 | whale |
| bird | 1 | penguin |
| bird | 2 | ostrich |
+--------+----+---------+
IDが1〜10の1つの「グループ」、IDが11〜20の別の「グループ」などGROUP BY
のレコードが必要な場合を除いて、基本的mammal
にIDを使用します。ただし、既存のテーブルを使用してこれを行います。そして、私は必ずしも「犬」がID 1で表示されることを望んでいません。その最初の順序をランダムにしたいのですが、その後は決定論的です。
numMammal
ます。私は実際にid dog
が何を取得するかは気にしませんが、元の挿入順序に依存しないようにします。
GROUP BY
。次に、平均値間の相関関係を見つけるために、10のグループをペアにすることができます。元の挿入順序がたまたまウェイトでソートされた場合、これは私に間違った結果を与えるため、このランダムな順序付けが必要です。私は理にかなっていると思います。
I would want that initial ordering to be random, but then deterministic from then out.
<-何を言う?何をするにしても、なんらかの種類の2番目のテーブルにレコードを配置する必要があると思います。このビジネスロジックはどの程度正確に機能しますか?(例えば)犬が最初に来ることを要求するものは何もないので。そして、どういう意味I would want the records from *mammal* to have one "group" for IDs 1-10, and another for IDs 11-20
ですか...上記の質問の説明で、哺乳類に焦点を当てた別の表でそれを説明できますか?