Code Monkey home page Code Monkey logo

sql_info's Introduction

SQL_info

Анализ и статистика данных по учащимся.

Содержание

Part 1. Создание базы данных
Part 2. Получение данных

Part 1. Создание базы данных

Скрипт part1.sql, создает базу данных и все таблицы, описанные ниже Также в скрипт есть процедуры, позволяющие импортировать и экспортировать данные для каждой таблицы из файла/в файл с расширением .csv.
В качестве параметра каждой процедуры указывается разделитель csv файла.

Таблица Peers

  • Ник пира
  • День рождения

Таблица Tasks

  • Название задания
  • Название задания, являющегося условием входа
  • Максимальное количество XP

Чтобы получить доступ к заданию, нужно выполнить задание, являющееся его условием входа. Для упрощения будем считать, что у каждого задания всего одно условие входа. В таблице должно быть одно задание, у которого нет условия входа (т.е. поле ParentTask равно null).

Статус проверки

Создать тип перечисления для статуса проверки, содержащий следующие значения:

  • Start - начало проверки
  • Success - успешное окончание проверки
  • Failure - неудачное окончание проверки

Таблица P2P

Каждая P2P проверка состоит из 2-х записей в таблице: первая имеет статус начало, вторая - успех или неуспех.
В таблице не может быть больше одной незавершенной P2P проверки, относящейся к конкретному заданию, пиру и проверяющему.
Каждая P2P проверка (т.е. обе записи, из которых она состоит) ссылается на проверку в таблице Checks, к которой она относится.

Таблица Verter

Каждая проверка Verter'ом состоит из 2-х записей в таблице: первая имеет статус начало, вторая - успех или неуспех.
Каждая проверка Verter'ом (т.е. обе записи, из которых она состоит) ссылается на проверку в таблице Checks, к которой она относится.
Проверка Verter'ом может ссылаться только на те проверки в таблице Checks, которые уже включают в себя успешную P2P проверку.

Таблица Checks

  • ID
  • Ник пира
  • Название задания
  • Дата проверки

Описывает проверку задания в целом. Проверка обязательно включает в себя один этап P2P и, возможно, этап Verter. Для упрощения будем считать, что пир ту пир и автотесты, относящиеся к одной проверке, всегда происходят в один день.

Проверка считается успешной, если соответствующий P2P этап успешен, а этап Verter успешен, либо отсутствует. Проверка считается неуспешной, хоть один из этапов неуспешен. То есть проверки, в которых ещё не завершился этап P2P, или этап P2P успешен, но ещё не завершился этап Verter, не относятся ни к успешным, ни к неуспешным.

Таблица TransferredPoints

  • ID
  • Ник проверяющего пира
  • Ник проверяемого пира
  • Количество переданных пир поинтов за всё время (только от проверяемого к проверяющему)

При каждой P2P проверке проверяемый пир передаёт один пир поинт проверяющему. Эта таблица содержит все пары проверяемый-проверяющий и кол-во переданных пир поинтов, то есть, другими словами, количество P2P проверок указанного проверяемого пира, данным проверяющим.

Таблица Friends

  • ID
  • Ник первого пира
  • Ник второго пира

Дружба взаимная, т.е. первый пир является другом второго, а второй -- другом первого.

Таблица Recommendations

  • ID
  • Ник пира
  • Ник пира, к которому рекомендуют идти на проверку

Каждому может понравиться, как проходила P2P проверка у того или иного пира. Пир, указанный в поле Peer, рекомендует проходить P2P проверку у пира из поля RecommendedPeer. Каждый пир может рекомендовать как ни одного, так и сразу несколько проверяющих.

Таблица XP

  • ID
  • ID проверки
  • Количество полученного XP

За каждую успешную проверку пир, выполнивший задание, получает какое-то количество XP, отображаемое в этой таблице. Количество XP не может превышать максимальное доступное для проверяемой задачи. Первое поле этой таблицы может ссылаться только на успешные проверки.

Таблица TimeTracking

  • ID
  • Ник пира
  • Дата
  • Время
  • Состояние (1 - пришел, 2 - вышел)

Данная таблица содержит информация о посещениях пирами кампуса. Когда пир входит в кампус, в таблицу добавляется запись с состоянием 1, когда покидает - с состоянием 2.

В заданиях, относящихся к этой таблице, под действием "выходить" подразумеваются все покидания кампуса за день, кроме последнего. В течение одного дня должно быть одинаковое количество записей с состоянием 1 и состоянием 2 для каждого пира.

Например:

ID Peer Date Time State
1 Aboba 22.03.22 13:37 1
2 Aboba 22.03.22 15:48 2
3 Aboba 22.03.22 16:02 1
4 Aboba 22.03.22 20:00 2

В этом примере "выходом" является только запись с ID, равным 2. Пир с ником Aboba выходил из кампуса на 14 минут.

Part 2. Получение данных

Скрипт part2.sql, содержит все описанные далее процедуры и функции.

1) Таблица TransferredPoints в человекочитаемом виде

Ник пира 1, ник пира 2, количество переданных пир поинтов.
Количество отрицательное, если пир 2 получил от пира 1 больше поинтов.

Пример вывода:

Peer1 Peer2 PointsAmount
Aboba Amogus 5
Amogus Sus -2
Sus Aboba 0
2) Таблица вида: ник пользователя, название проверенного задания, кол-во полученного XP

В таблицу включать только задания, успешно прошедшие проверку (определять по таблице Checks).
Одна задача может быть успешно выполнена несколько раз. В таком случае в таблицу включать все успешные проверки.

Пример вывода:

Peer Task XP
Aboba C8 800
Aboba CPP3 750
Amogus DO5 175
Sus A4 325
3) Пиры, которые не выходили из кампуса в течение всего дня

Параметры функции: день, например 12.05.2022.
Функция возвращает только список пиров.

4) Процент успешных и неуспешных проверок за всё время

Формат вывода: процент успешных, процент неуспешных

Пример вывода:

SuccessfulChecks UnsuccessfulChecks
35 65
5) Посчитать изменение в количестве пир поинтов каждого пира по таблице TransferredPoints

Результат вывести отсортированным по изменению числа поинтов.
Формат вывода: ник пира, изменение в количество пир поинтов

Пример вывода:

Peer PointsChange
Aboba 8
Amogus 1
Sus -3
6) Посчитать изменение в количестве пир поинтов каждого пира по таблице, возвращаемой первой функцией из Part 2

Результат вывести отсортированным по изменению числа поинтов.
Формат вывода: ник пира, изменение в количество пир поинтов

Пример вывода:

Peer PointsChange
Aboba 8
Amogus 1
Sus -3
7) Определить самое часто проверяемое задание за каждый день

При одинаковом количестве проверок каких-то заданий в определенный день, вывести их все.
Формат вывода: день, название задания

Пример вывода:

Day Task
12.05.2022 A1
17.04.2022 CPP3
23.12.2021 C5
8) Определить длительность последней P2P проверки

Под длительностью подразумевается разница между временем, указанным в записи со статусом "начало", и временем, указанным в записи со статусом "успех" или "неуспех".
Формат вывода: длительность проверки

9) Найти всех пиров, выполнивших весь заданный блок задач и дату завершения последнего задания

Параметры процедуры: название блока, например "CPP".
Результат вывести отсортированным по дате завершения.
Формат вывода: ник пира, дата завершения блока (т.е. последнего выполненного задания из этого блока)

Пример вывода:

Peer Day
Sus 23.06.2022
Amogus 17.05.2022
Aboba 12.05.2022
10) Определить, к какому пиру стоит идти на проверку каждому обучающемуся

Определять нужно исходя из рекомендаций друзей пира, т.е. нужно найти пира, проверяться у которого рекомендует наибольшее число друзей.
Формат вывода: ник пира, ник найденного проверяющего

Пример вывода:

Peer RecommendedPeer
Aboba Sus
Amogus Aboba
Sus Aboba
11) Определить процент пиров, которые:
  • Приступили только к блоку 1
  • Приступили только к блоку 2
  • Приступили к обоим
  • Не приступили ни к одному

Пир считается приступившим к блоку, если он проходил хоть одну проверку любого задания из этого блока (по таблице Checks)

Параметры процедуры: название блока 1, например SQL, название блока 2, например A.
Формат вывода: процент приступивших только к первому блоку, процент приступивших только ко второму блоку, процент приступивших к обоим, процент не приступивших ни к одному

Пример вывода:

StartedBlock1 StartedBlock2 StartedBothBlocks DidntStartAnyBlock
20 20 5 55
12) Определить N пиров с наибольшим числом друзей

Параметры процедуры: количество пиров N.
Результат вывести отсортированным по кол-ву друзей.
Формат вывода: ник пира, количество друзей

Пример вывода:

Peer FriendsCount
Amogus 15
Aboba 8
Sus 0
13) Определить процент пиров, которые когда-либо успешно проходили проверку в свой день рождения

Также определите процент пиров, которые хоть раз проваливали проверку в свой день рождения.
Формат вывода: процент успехов в день рождения, процент неуспехов в день рождения

Пример вывода:

SuccessfulChecks UnsuccessfulChecks
60 40
14) Определить кол-во XP, полученное в сумме каждым пиром

Если одна задача выполнена несколько раз, полученное за нее кол-во XP равно максимальному за эту задачу.
Результат вывести отсортированным по кол-ву XP.
Формат вывода: ник пира, количество XP

Пример вывода:

Peer XP
Amogus 15000
Aboba 8000
Sus 400
15) Определить всех пиров, которые сдали заданные задания 1 и 2, но не сдали задание 3

Параметры процедуры: названия заданий 1, 2 и 3.
Формат вывода: список пиров

16) Используя рекурсивное обобщенное табличное выражение, для каждой задачи вывести кол-во предшествующих ей задач

То есть сколько задач нужно выполнить, исходя из условий входа, чтобы получить доступ к текущей.
Формат вывода: название задачи, количество предшествующих

Пример вывода:

Task PrevCount
CPP3 7
A1 9
C5 1
17) Найти "удачные" для проверок дни. День считается "удачным", если в нем есть хотя бы N идущих подряд успешных проверки

Параметры процедуры: количество идущих подряд успешных проверок N.
Временем проверки считать время начала P2P этапа.
Под идущими подряд успешными проверками подразумеваются успешные проверки, между которыми нет неуспешных.
При этом кол-во опыта за каждую из этих проверок должно быть не меньше 80% от максимального.
Формат вывода: список дней

18) Определить пира с наибольшим числом выполненных заданий

Формат вывода: ник пира, число выполненных заданий

Пример вывода: Output example:

Peer XP
Amogus 5
19) Определить пира с наибольшим количеством XP

Формат вывода: ник пира, количество XP

Пример вывода:

Peer XP
Amogus 15000
20) Определить пира, который провел сегодня в кампусе больше всего времени

Формат вывода: ник пира

21) Определить пиров, приходивших раньше заданного времени не менее N раз за всё время

Параметры процедуры: время, количество раз N.
Формат вывода: список пиров

22) Определить пиров, выходивших за последние N дней из кампуса больше M раз

Параметры процедуры: количество дней N, количество раз M.
Формат вывода: список пиров

23) Определить пира, который пришел сегодня последним

Формат вывода: ник пира

24) Определить пиров, которые выходили вчера из кампуса больше чем на N минут

Параметры процедуры: количество минут N.
Формат вывода: список пиров

25) Определить для каждого месяца процент ранних входов

Для каждого месяца посчитать, сколько раз люди, родившиеся в этот месяц, приходили в кампус за всё время (будем называть это общим числом входов).
Для каждого месяца посчитать, сколько раз люди, родившиеся в этот месяц, приходили в кампус раньше 12:00 за всё время (будем называть это числом ранних входов).
Для каждого месяца посчитать процент ранних входов в кампус относительно общего числа входов.
Формат вывода: месяц, процент ранних входов

Пример вывода:

Month EarlyEntries
January 15
February 35
March 45

sql_info's People

Contributors

gloomyana avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.