2011-12-09 4 views
1

나는이 질문을 어떻게 표현할 지 잘 모르겠다. 그래서 여기에 세부 사항이있다. 두 비트 스트링 사이의 해밍 거리를 계산하기 위해 트릭을 사용하고 있습니다. ,PostgreSQL 하위 쿼리에 다른 열을 어떻게 추가합니까?

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를 반환하기 위해 내가 무엇을해야하는지 알지 못합니다.

아무에게도이 작업을 수행하는 방법에 대한 아이디어가 있습니까?

답변

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. 일반적으로 포스트그레스는 중간 결과 전체를 정렬하지 않고 가장 낮은 값을 가진 행을 검색 할 정도로 똑똑 할 것입니다.

+0

Brilliant! 나는 그것이 단순한 무엇인지 알았다. PostgreSQL을 처음 접했고 이런 식으로 구문을 알지 못했습니다. 'limit 1 '부분은 실제로 최소한의 두 개 또는 세 개의 해밍 거리가 필요할 때가 있으므로 일을 더 쉽게 만듭니다. 고마워요! –

관련 문제