Это может быть немного сложно объяснить, но у меня есть две колонки в моей базе данных SQL-сервера, которые я упростил ...
Продукты
ID
ITEMNAME
voteCount
оценка
1012 * Голоса *
Itemid
оценка
Итак, в основном я храню каждый голос, который помещен в одну таблицу, а также подсчет количества голосов за каждый элемент в таблице элементов вместе с его средним баллом (из 10) (который, я знаю, дублирует). данные, но это облегчает жизнь).
В любом случае, я хочу создать запрос SQL, который находит 2 элемента с наименьшим количеством баллов. Это было бы легко, если бы вы просто делали это ...
SELECT TOP 2 itemName FROM Items ORDER BY score ASC;
Однако клиент добавил следующее осложнение.
Если 2 или более элементов имеют одинаковое количество баллов, то элемент с наибольшим количеством голосов 10/10 будет размещен выше. Если 2 или более элемента имеют одинаковое количество баллов и одинаковое количество голосов 10/10, то он оценивает элемент с наибольшим количеством голосов, равным 9/10, над остальными и т. Д., Вплоть до числа 0/10 голосов, если все остальное равно.
Итак, задача состоит в том, чтобы ранжировать все элементы по этим критериям, а затем выбрать дно 2. Я попробовал каждую комбинацию группировки, агрегирования и «подзапроса», чтобы решить эту проблему, но я думаю, что мне нужна помощь кто-то намного умнее меня.
Любая помощь будет принята с благодарностью.
Разъяснение
Средний балл за предмет сохраняется в таблице предметов, а счет, полученный за каждый голос, сохраняется в таблице голосов. Первоначально нам нужно ранжировать по среднему баллу (I.score), и когда 2 элемента имеют одинаковую оценку, нам нужно начать подсчет числа 10/10 в голосах, связанных с этим элементом (v.score).
Итак, у нас может быть предмет под названием «футболка», который имеет средний балл 5/10. Это 6 голосов при следующих 5,5,5,5,5,5.
Следующий элемент называется «Ferrari» и также имеет средний балл 5/10, но этот элемент имеет только 4 голоса со следующими баллами 6,5,5,4
Ясно, что Ferrari должен победить, потому что sql увидит, что у него нет ни 10, ни 9, ни 8, ни 7, но у него есть голос 6, который превосходит футболку.