0

巨大なテーブルの階層化されたサンプルを取得する必要があります。具体的には、バイアスなしでテーブルから 1/n 行を選択したい、つまり、ランダムに選択したり、n 行ごとに選択したりします。

この質問をする前に、これをやってみました。しかし、私は InfiniDB エンジンを使用しているため、うまくいきませんでした。後でわかったように、部分式の変数などをサポートしていません。ユーザー変数なしでこれを行う方法を知っている人はいますか?

私は次のようなことを考えていました: 私のテーブルでは、すべての行に一意の英数字文字列ID があり"1234567890"、 、または のようになり"abcdef12345"ます。どういうわけかその文字列を数値に変換し、モジュロ関数を使用してテーブルから 1/n 行のみを選択することを考えていました。ただし、この文字列は 16 進数ではないため、変換方法がわかりません。

注: 私のテーブルには、自動インクリメントされた列がありません。

4

1 に答える 1

3

これは複雑ですが、実行できます。相関サブクエリを使用してこのクエリに実装された自己結合と集計が必要です。おそらく大きなテーブルがあるため、これはうまく機能しないと思います。10% のサンプルの場合、次のようになります。

select ht.*,
       (select count(*)
        from hugetable ht2
        where ht2.col < ht.col or
              (ht2.col = ht.col and ht2.id <= ht.id)
       ) as rn
from hugetable ht
having rn % 10 = 1;

このコンテキストでの の使用はhaving、MySQL に固有のものであることに注意してください。サブクエリを使用せずに行をフィルタリングできます。

編集:

おそらく唯一の実行可能なアプローチは、自動インクリメント ID を持つ別のテーブルを作成することです。以下は、簡略化されたバージョンです。

create table temp (
    id int auto_increment,
    idstring varchar(255),
    col varchar(255)
);

insert into temp(idstring, col)
    select idstring, col
    from hugetable ht
    order by col;

select *
from temp
where id % 10 = 1;
于 2014-07-21T13:39:38.817 に答える