Приведена таблица ответов с колонками:
Имя пользователя, Номер урока, Номер вопроса, Ответ, Оценка, Метка времени
Как мне выполнить запрос, который показывает, какие пользователи получили оценку 90 или выше при первой попытке ответить на каждый вопрос в последних 5 уроках? «последние 5 уроков» являются скорее ограничивающим условием, чем требованием, поэтому, если они полностью закончили только 1 урок, но все свои первые попытки выполнили правильно для каждого вопроса, то они должны быть включены в результаты. Мы просто не хотим оглядываться на 5 уроков.
О данных: пользователи могут быть на разных уроках. Некоторые пользователи, возможно, еще не завершили пять уроков (например, могут быть только на уроке 3). Каждый урок имеет разное количество вопросов. У пользователей разные пути уроков, поэтому они могут пропускать некоторые номера уроков или даже выполнять уроки не по порядку.
Поскольку это, по-видимому, проблема преобразования временно неоднородных / прерывистых значений в однородные / непрерывные значения для пользователя, я думаю, что я могу решить большую часть проблемы с помощью пары функций ранжирования. Условная спецификация оценки выше 90 для «первой попытки на каждый вопрос в последних 5 уроках» также сложна, потому что количество выполненных вопросов варьируется для каждого пользователя.
Пока ...
В качестве отправной точки или намека на то, что, возможно, должно произойти, я преобразовал метку времени в «AttemptNumber» для каждого вопроса, используя «row_number () over (разделение по имени пользователя, LessonNumber, QuestionNumber, порядок по метке времени) как AttemptNumber».
Я также пытаюсь преобразовать LessonNumber из абсолютного значения в непрерывное ранжированное значение для отдельных пользователей. Я мог бы использовать «density_rank () over (разделение по порядку имени пользователя по LessonNumber desc) как LessonRank», но это предполагает, что порядок уроков завершен соответствует порядку LessonNumber, что, к сожалению, не всегда так. Тем не менее, давайте предположим, что это так, поскольку у меня есть способ получения такого числа через пару соединений, поэтому я могу использовать описанное преобразование density_rank для выбора «последних 5 завершенных уроков» (т. Е. LessonRank <= 5 ). </p>
Для условия> 90, я думаю, я могу преобразовать счет в целое число, чтобы оно равнялось «1», если> = 90, и «0», если <90. Затем я могу ввести фразу типа «группа» с именем пользователя, имеющим SUM (Score) = COUNT (Score). ", Который выберет только тех пользователей, у которых все оценки равны 1. </p>
Любые решения или предложения будут оценены.