EduPro
EdTech / online learning
EduPro sells self-paced online courses in data, programming, marketing, design and business. It tracks every step from sign-up to certificate: enrolments and what learners paid, each lesson they finish, assessment attempts, certificates and course reviews. Analysts use it to measure completion funnels, drop-off points, course revenue, instructor performance and learner retention, which are standard SQL interview topics at edtech companies.
See the EduPro tables
EduPro schema
All tables live in the edupro schema, so write edupro.students in your queries.
edupro.students
Registered learners.
student_id(INT) — PKfull_name(VARCHAR(80))email(VARCHAR(120))country(VARCHAR(40))signup_date(DATE)acquisition_channel(VARCHAR(20)) — 'organic', 'paid_search', 'referral', 'social'
edupro.instructors
Course instructors.
instructor_id(INT) — PKfull_name(VARCHAR(80))expertise(VARCHAR(40))
edupro.courses
The course catalogue.
course_id(INT) — PKtitle(VARCHAR(120))category(VARCHAR(20)) — 'Data', 'Programming', 'Marketing', 'Design', 'Business'difficulty(VARCHAR(12)) — 'beginner', 'intermediate', 'advanced'instructor_id(INT) — FK → instructors.instructor_idprice(DECIMAL(8,2)) — list price in INRcreated_at(DATE)is_published(BOOLEAN)
edupro.lessons
Lessons in each course, in order.
lesson_id(INT) — PKcourse_id(INT) — FK → courses.course_idlesson_order(INT) — 1 = first lessontitle(VARCHAR(120))duration_minutes(INT)
edupro.enrollments
One row per student per course.
enrollment_id(INT) — PKstudent_id(INT) — FK → students.student_idcourse_id(INT) — FK → courses.course_idenrolled_at(DATE)status(VARCHAR(10)) — 'ACTIVE', 'DROPPED', 'COMPLETED'price_paid(DECIMAL(8,2)) — after coupons; can be below the list pricecompleted_at(DATE) — nullable; set when status is COMPLETED
edupro.lesson_progress
One row each time a student finishes a lesson.
progress_id(INT) — PKenrollment_id(INT) — FK → enrollments.enrollment_idlesson_id(INT) — FK → lessons.lesson_idcompleted_at(TIMESTAMP)
edupro.assessments
Final assessment attempts.
assessment_id(INT) — PKcourse_id(INT) — FK → courses.course_idstudent_id(INT) — FK → students.student_idattempt_number(INT)score(INT)max_score(INT)submitted_at(TIMESTAMP)
edupro.certificates
Certificates issued on completion.
certificate_id(INT) — PKstudent_id(INT) — FK → students.student_idcourse_id(INT) — FK → courses.course_idissued_at(DATE)
edupro.course_reviews
Star ratings left by learners.
review_id(INT) — PKenrollment_id(INT) — FK → enrollments.enrollment_idrating(INT) — 1 to 5created_at(DATE)
Beginner (10)
- BeginnerPublished courses per categoryOpen now
- BeginnerBeginner courses under ₹1,000Open now
- BeginnerLearners by country
- BeginnerEnrolments in the last 30 days
- BeginnerEnrolments by status
- BeginnerAverage course price by difficulty
- BeginnerCertificates issued this month
- BeginnerReferral sign-ups in the last 90 days
- BeginnerPerfect assessment scores
- BeginnerCourses per instructor
Intermediate (11)
- IntermediateCompletion rate by course
- IntermediateRevenue and discounting by category
- IntermediateAverage first-attempt score by course
- IntermediateLearners enrolled in 3 or more courses
- IntermediateCompletions with no certificate
- IntermediateWhere do learners drop out?
- IntermediateFirst-attempt pass rate by difficulty
- IntermediateMonthly enrolments by acquisition channel
- IntermediatePublished courses with no enrolments in 90 days
- IntermediateHow long does completion take?
- IntermediateCanonical learner email-domain counts
Advanced (22)
- AdvancedLesson-by-lesson funnel for a course
- AdvancedCourse revenue rank within category
- AdvancedWhat do learners take next?
- AdvancedSecond purchase within 60 days
- AdvancedHow much do retakes improve scores?
- AdvancedWeekly active learners
- AdvancedActive learners who have stalled
- AdvancedInstructor leaderboard
- AdvancedHow concentrated is revenue?
- AdvancedTime from enrolment to first lesson
- AdvancedEnrolments with every course lesson completed
- AdvancedProgress rows linked to the wrong course
- AdvancedBest assessment attempt when maximum scores differ
- AdvancedThirty-day completion by enrolment cohort
- AdvancedAssessment score spread, not only the mean
- AdvancedInspect the key needed for idempotent lesson completion
- AdvancedA complete acquisition-channel by category matrix
- AdvancedRemove duplicate completion rows while preserving earliest evidence
- AdvancedCumulative curriculum duration with ordered ties
- AdvancedChannel completion comparison with course-mix strata
- AdvancedLesson-count versus duration-weighted completion
- AdvancedDesign a completion table with a composite business key
Mock interview round (5)
- AdvancedMock round 1: Monthly revenue and growth
- AdvancedMock round 2: Learning funnel
- AdvancedMock round 3: Which channels bring the best learners?
- AdvancedMock round 4: Popular but poorly rated courses
- AdvancedMock round 5: Who should get the next-course offer?