0

テーブルで実行するバッチ ジョブがあり、準備済みステートメントとして記述できると確信しています。現在、それはすべてJavaで行われており、間違いなく効率的ではありません。次のようなテーブルの場合:

CREATE TABLE thing (
  `tag` varchar,
  `document` varchar,
  `weight` float,
)

すべてのタグの上位 N エントリを含む新しいテーブルを作成したいと考えています。現在、私はこれを行います:

create new table with same schema
select distinct tag
for each tag:
  select * limit N insert into the new table

これには、クエリを実行して個別tagの を取得し、そのタグの上位Nアイテムを選択して挿入する必要があります...すべて非常に非効率的です。

これを行うために使用できるストアド プロシージャ (または単純なクエリ) はありますか? 方言が重要な場合は、MySQL を使用しています。

(そして、はい、私は自分のインデックスをソートしています!)

乾杯

ジョー

4

2 に答える 2

1

私はしばらくこれをしていません(SQL ServerのCTEによって台無しにされています)、そしてあなたのデータは重量順に並べられていると思います。試す

SELECT tag, document, weight
FROM thing
WHERE (SELECT COUNT(*)
       FROM thing as t
       WHERE t.tag = thing.tag AND t.weight < thing.weight
) < N;

私はそれがそれをするだろうと思います。

編集:コードのエラーを修正しました。<=Nではなく<Nが必要です。

于 2009-10-08T19:38:15.023 に答える
0

SQL Serverを使用している場合は、タグでグループ化されたROW_NUMBER関数を使用し、row_number <Nの場所を選択することをお勧めします(つまり、タググループ内の位置に従って、各タグの行を並べ替えて番号を付けます。各グループから上位N行を選択します。)MySQLでのROW_NUMBER関数のシミュレーションに関する記事をここで見つけました。

http://www.xaprb.com/blog/2006/12/02/how-to-number-rows-in-mysql/

これがあなたを助けるかどうか見てください!

于 2009-10-08T19:37:04.213 に答える