1

この質問の言い方がよくわからなかったので、ここに詳細を示します。2 つのビット文字列間のハミング距離を計算するトリックを使用しています。クエリは次のとおりです。

select length(replace(x::text,'0',''))
from (
    select code # '000111101101001010' as x
    from codeTable
) as foo

基本的に、2 つの文字列間の xor を計算し、すべての 0 を削除してから、長さを返します。これは、2 つのビット文字列間のハミング距離と機能的に同等です。残念ながら、これはハミング距離のみを返し、それ以外は何も返しません。codeTable テーブルには、person_id という列もあります。最小ハミング距離とそれに関連付けられた ID を返せるようにしたいと考えています。最小ハミング距離を返すのは簡単です。'length' 部分の周りに min() を追加するだけです。

select min(length(replace(x::text,'0','')))
from (
    select code # '000111101101001010' as x
    from codeTable
) as foo

これは問題ありませんが、person_id ではなく、ハミング距離のみを返します。そのハミング距離に関連付けられた person_id を返すために何をする必要があるかわかりません。

これを行う方法について誰か考えがありますか?

4

1 に答える 1

2

私は何かが足りないのですか?なぜサブクエリなのですか?次のように私には見えます:

select length(replace((code # '000111101101001010')::text,'0',''))
from codeTable

そこから行くと、次のようになります。

select person_id,length(replace((code # '000111101101001010')::text,'0','')) as x
from codeTable
order by x
limit 1

min関数によって返される値に対応するperson_idを取得する直接的な方法がないため、minをorderbyおよびlimit1に置き換えました。一般に、postgresは、中間結果全体をソートするのではなく、返す必要のある最小値の行をスキャンするだけで十分に賢くなります。

于 2011-12-09T06:39:46.707 に答える