Я не могу на всю жизнь понять, как получить взвешенное ранжирование по десяткам по категориям. Например, студент должен ответить на 10 вопросов по трем категориям (как в случае вопросов, так и в # категории будет изменяться в конце концов). Чтобы получить общий балл, верхний 1 балл в каждой из категорий X (3) будет добавлен к тому, что осталось, чтобы добавить до 10 полных баллов.Требуется ли это рекурсивный CTE, просто творческие функции окна, цикл?
Вот данные. Я использовал случай, когда row_number(), чтобы получить TopInCat
http://sqlfiddle.com/#!6/e6e9f/1
скрипку имеет больше студентов.
| Question | Student | Category | Score | TopInCat | |----------|---------|----------|-------|----------| | 120149 | 125 | 6 | 1 | 1 | | 120127 | 125 | 6 | 0.9 | 0 | | 120124 | 125 | 6 | 0.8 | 0 | | 120125 | 125 | 6 | 0.7 | 0 | | 120130 | 125 | 6 | 0.6 | 0 | | 120166 | 125 | 6 | 0.5 | 0 | | 120161 | 125 | 6 | 0.4 | 0 | | 120138 | 125 | 4 | 0.15 | 1 | | 120069 | 125 | 4 | 0.15 | 0 | | 120022 | 125 | 4 | 0.15 | 0 | | 120002 | 125 | 4 | 0.15 | 0 | | 120068 | 125 | 2 | 0.01 | 1 | | 120050 | 125 | 3 | 0.05 | 1 | | 120139 | 125 | 2 | 0 | 0 | | 120156 | 125 | 2 | 0 | 0 |
Это то, как я предполагаю, что он должен выглядеть, но это не обязательно должно быть именно это. Мне просто нужно иметь 10 вопросов по 3 деталям данных таким образом, чтобы я мог суммировать и усреднять столбцы Sort 1-10 ниже. 999-е могут быть нулевыми или любыми, если я могу судить о том, что важно и представить детали.
| Question | Student | Category | Score | TopInCat | Sort | |----------|---------|----------|-------|----------|------| | 120149 | 125 | 6 | 1 | 1 | 1 | | 120138 | 125 | 4 | 0.15 | 1 | 2 | | 120068 | 125 | 2 | 0.01 | 1 | 3 | | 120127 | 125 | 6 | 0.9 | 0 | 4 | | 120124 | 125 | 6 | 0.8 | 0 | 5 | | 120125 | 125 | 6 | 0.7 | 0 | 6 | | 120130 | 125 | 6 | 0.6 | 0 | 7 | | 120166 | 125 | 6 | 0.5 | 0 | 8 | | 120161 | 125 | 6 | 0.4 | 0 | 9 | | 120069 | 125 | 4 | 0.15 | 0 | 10 | | 120022 | 125 | 4 | 0.15 | 0 | 999 | | 120002 | 125 | 4 | 0.15 | 0 | 999 | | 120050 | 125 | 3 | 0.05 | 1 | 999 | | 120139 | 125 | 2 | 0 | 0 | 999 | | 120156 | 125 | 2 | 0 | 0 | 999 |
Последнее, что категория не имеет значения, когда порог X (3) встречается. Таким образом, 4-я категория будет нормально сортироваться.
| Question | Student | Category | Score | TopInCat | Sort | |----------|---------|----------|-------|----------|------| | 120149 | 126 | 6 | 1 | 1 | 1 | | 120138 | 126 | 4 | 0.75 | 1 | 2 | | 120068 | 126 | 2 | 0.50 | 1 | 3 | | 120127 | 126 | 6 | 0.9 | 0 | 4 | | 120124 | 126 | 6 | 0.8 | 0 | 5 | | 120125 | 126 | 6 | 0.7 | 0 | 6 | | 120130 | 126 | 6 | 0.6 | 0 | 7 | | 120166 | 126 | 6 | 0.5 | 0 | 8 | | 120050 | 126 | 3 | 0.45 | 1 | 9 |******** | 120161 | 126 | 6 | 0.4 | 0 | 10 | | 120069 | 126 | 4 | 0.15 | 0 | 999 | | 120022 | 126 | 4 | 0.15 | 0 | 999 | | 120002 | 126 | 4 | 0.15 | 0 | 999 | | 120139 | 126 | 2 | 0 | 0 | 999 | | 120156 | 126 | 2 | 0 | 0 | 999 |
Я очень ценю любую помощь. Я бил головой об этом несколько дней.
Это замечательно! Благодаря! Я начал что-то вроде этого, но думал, что должен быть лучший способ. Я нашел небольшую проблему с вашим кодом. В NotTopInCat - WHERE Вопрос NOT IN не является специфическим для ученика, поэтому он должен быть ГДЕ НЕ СУЩЕСТВУЕТ (SELECT 1 FROM TopInCat TIC WHERE TIC.Student = WS.Student AND TIC.Question = WS.Question) Можете ли вы обновить ответ? Я собираюсь сделать больше проверки, но я думаю, что это, вероятно, лучшее решение. Еще раз спасибо. – cporichie
@cporichie да, это было, когда я все еще думал, что «Вопрос» был ПК, а на самом деле «(Вопрос, Студент)» - это ПК. Обновление сейчас. – AakashM