Способ, с помощью которого алгоритм вычисляет ранг, заключается в подсчете количества строк в перекрестном произведении с оценкой, равной или большей, чем у рассматриваемой девушки, для получения ранга. Следовательно, в проблемном случае, о котором вы говорите, сетка Сары будет выглядеть как
a.name | a.score | b.name | b.score
-------+---------+---------+--------
Sarah | 9 | Sarah | 9
Sarah | 9 | Deborah | 9
и аналогично Деборе, поэтому обе девушки получают здесь звание 2.
Проблема заключается в том, что когда есть ничья, все девочки принимают значение самое низкое в связанном диапазоне из-за этого количества, когда вы хотите, чтобы они взяли самое высокое значение. Я думаю, что простое изменение может исправить это:
Вместо сравнения «больше или равно», используйте строгое сравнение «больше, чем», чтобы подсчитать число девушек, которые являются строго лучше. Затем добавьте один к этому, и у вас будет свой ранг (который будет иметь дело с галстуками в зависимости от ситуации). Таким образом, внутренний выбор будет:
SELECT a.id, COUNT(*) + 1 AS ranknum
FROM girl AS a
INNER JOIN girl AS b ON (a.hair = b.hair) AND (a.score < b.score)
GROUP BY a.id
HAVING COUNT(*) <= 3
Может кто-нибудь увидеть какие-либо проблемы с этим подходом, которые ускользнули от моего уведомления?