Подход, который я бы использовал, состоял бы в том, чтобы создать функцию оценки (ваш сохраненный процесс), которая оценивала бы стандартное расстояние данного ввода от среднего.
В процедуре вы будете оценивать каждый критерий следующим образом:
INPUT AGE: 32
calculate MEAN of AGE WHERE (sex = m): 34.5
calculate STANDARD DEVIATION of AGE WHERE (sex = m): 2.5
calculate how many STDEVs 32 is from the 34.5 (also known as z-score): 1
Повторите этот процесс для всех числовых типов данных, суммируя их и ЗАКАЗЫВАЯ ПО сумме.
При этом потребовалось бы следующее изменение схемы: высота изменилась с фут / дюйм на строго дюймы.
В зависимости от ваших потребностей, вы можете также рассмотреть возможность выбора произвольной шкалы для пола и цвета кожи / цвета волос. Конечно, вы можете подумать, что подобные меры НЕ должны учитываться из-за того, насколько радикально это изменит функцию оценки. Если бы вы выбрали, вам нужно было бы найти какое-то число, которое будет добавлено к вышеупомянутой сумме ... но это трудно, потому что номинативные переменные не легко переводятся в такие вещи.
Если вы обнаружите, что цвет волос / цвет кожи можно с пользой перевести в, скажем, непрерывный спектр цветов, ваш выигрыш будет таким же ... значение цвета ввода по сравнению со значением цвета средних и стандартных отклонений.
Запрос, который найдет ваши совпадения, будет иметь следующий эффект:
SELECT
ABS(INPUT_AGE - AVG(AGE)) / STD(AGE) AS age_z,
ABS(INPUT_WT - AVG(WT)) / STD(WT) AS wt_z,
...
(age_z + wt_z + ...) AS score
FROM `table`
ORDER BY score ASC