3

局の国別に集計したい QSO (無線連絡) レコードのデータベースがあります。国は、 ITU プレフィックス リストで定義されているように、ステーション コールサインのプレフィックスから派生します。

残念ながら、このプレフィックスは可変長です。たとえば、W で始まるものはすべて米国に割り当てられますが、ほとんどの国は 1 つまたは複数の 2 文字のプレフィックスで識別されます。たとえば、3DA から 3DM へはスワジランドですが、3DN から 3DZ へは Fidji など、3 文字の接頭辞が必要なものもあります。

次のようにテーブルを作成できます。

CREATE TABLE country (
    prefix varchar(3) primary key,
    country varchar(10)
);

やや醜い式で単純な結合を実行します。

SELECT * from qso
INNER JOIN country
ON left(qso.callsign, length(country.prefix)) = country.prefix

当然のことながら、これはネストされたループを使用して結合を実行します。国テーブルのプレフィックスが重複しないという追加の知識がなければ、この結合は単一の QSO に対して複数の国を返す可能性があるため、これは理にかなっています。

今、私は醜いハックを使用して、すべての明示的な 3 文字のプレフィックスをprefixテーブルに挿入し、等値結合を使用することができました。これにより、プレフィックス テーブルのサイズが 150 倍に増加しますが、当然、ハッシュ結合またはマージ結合を使用できます。

しかし、私のプレフィックスは重複しておらず、QSO はすでにコールサインによってインデックス化されているため、この結合を実行するための明らかに効率的なマージのようなアルゴリズムがあります。

私が考えている結合アルゴリズムに Postgres を導く方法はありますか? ファンシーなインデックスタイプや特別なマッチ演算子を使っているのではないでしょうか?

注: QSO テーブルは次のようなものです。

CREATE TABLE qso (
    time_on timestamp primary key,
    callsign varchar(10),
    ...
);
CREATE INDEX qso_callsign ON qso(callsign);
4

2 に答える 2

1

これを行う適切な方法の 1 つは、カスタム プレフィックス マッチング関数を で定義し、句CREATE OPERATORを介してマージ結合可能としてマークすることです。MERGESこれが実際に機能することをテストしたら、この回答を編集します。

もう 1 つは、自然な照合順序で定義されているように、制限された副選択を使用して、コールサインよりも小さい「最大」のプレフィックスを見つけることです。これはより自然な方法です。

于 2013-05-12T00:45:29.923 に答える