1

我不太确定如何表达这个问题,所以这里有详细信息。我正在使用一种技巧来计算两个位串之间的汉明距离。这是查询:

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。

有人知道如何做到这一点吗?

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

我用 order by 和 limit 1 替换了 min,因为没有直接的方法可以为 min 函数返回的值获取相应的 person_id。一般来说,postgres 足够聪明,不会对整个中间结果进行排序,而只是扫描它以查找它必须返回的最低值的行。

于 2011-12-09T06:39:46.707 回答