我不太确定如何说出这个问题,所以这里有详细信息。我正在使用技巧来计算两个位串之间的汉明距离。这是查询:
select length(replace(x::text,'0',''))
from (
select code # '000111101101001010' as x
from codeTable
) as foo
本质上,它计算两个字符串之间的xor,删除所有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。
有没有人知道如何做到这一点?
答案 0 :(得分: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
我使用order by和limit 1替换min,因为没有直接的方法来获取min函数返回的值的相应person_id。一般来说,postgres足够聪明,不会对整个中间结果进行排序,而只是扫描它必须返回的最低值的行。