2011-12-09 45 views
1

我不太確定如何解釋這個問題,所以這裏是細節。我正在使用一個技巧來計算兩個位串之間的漢明距離。這裏的查詢:如何添加另一列到PostgreSQL子查詢?

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

本質上,它計算兩個字符串之間的異或,刪除全部爲0,然後返回長度。這在功能上等同於兩個位串之間的漢明距離。不幸的是,這隻會返回漢明距離,沒有別的。在codeTable表中,還有一個名爲person_id的列。我希望能夠返回最小海明距離和與之相關的id。返回最小海明距離非常簡單,只需在「長度」部分添加一個min()。

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

這很好,但是,它只返回漢明距離,而不是person_id。我不知道我需要做什麼才能返回與漢明距離相關聯的person_id。

有沒有人有任何想法如何做到這一點?

回答

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 

我更換了分鐘,由秩序和限制1,因爲沒有得到的沒有直接的方法min函數返回的值對應的person_id。一般來說,postgres會非常聰明,不會對整個中間結果進行排序,而只是掃描它所返回的最低值的行。

+0

太棒了!我知道這很簡單。我是PostgreSQL的新手,並不確定以這種方式執行此操作的語法。 「限制1」部分實際上使事情變得更容易,因爲有時我需要最低的兩到三個漢明距離。非常感謝! –

相關問題