Как добавить еще один столбец в подзапрос PostgreSQL? - PullRequest
1 голос
/ 09 декабря 2011

Я не был слишком уверен, как сформулировать этот вопрос, поэтому вот подробности.Я использую трюк для вычисления расстояния Хэмминга между двумя цепочками битов.Вот запрос:

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

По сути, он вычисляет xor между двумя строками, удаляет все 0 и возвращает длину.Это функционально эквивалентно расстоянию Хэмминга между двумя цепочками битов.К сожалению, это только возвращает расстояние Хэмминга и ничего больше.В таблице codeTable также есть столбец с именем person_id.Я хочу иметь возможность вернуть минимальное расстояние Хемминга и идентификатор, связанный с этим.Возврат минимального расстояния Хэмминга достаточно прост, просто добавьте min () вокруг части 'length'.

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

Это нормально, однако возвращает только расстояние Хэмминга, а не person_id.Я понятия не имею, что мне нужно сделать, чтобы вернуть person_id, связанный с этим расстоянием Хемминга.

Кто-нибудь знает, как это сделать?

1 Ответ

2 голосов
/ 09 декабря 2011

Я что-то упустил? Почему подзапрос? Мне кажется, что должно работать следующее:

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 на order by и limit 1, потому что нет прямого способа получить соответствующий person_id для значения, возвращаемого функцией min. В общем, postgres будет достаточно умен, чтобы не сортировать весь промежуточный результат, а просто просканировать его на наличие строки с наименьшим значением, которое он должен вернуть.

...