Appearance
exam_results
Exam attempts by learners.
- ETL strategy:
merge - PK:
id
Columns
| Column | Type | Description |
|---|---|---|
id | BIGINT | PK. |
id_tenant | BIGINT | FK → tenants.id. |
id_product | BIGINT | FK → products.id. |
id_exam | BIGINT | FK → exams.id. |
id_user | BIGINT | FK → users.id. |
id_lesson | BIGINT | FK → lessons.id. Lesson that hosted the exam. |
is_discarded | BOOLEAN | Attempt discarded. |
is_finished | BOOLEAN | Attempt finished. |
is_timeout | BOOLEAN | Attempt closed due to timeout. |
min_score | FLOAT | Passing score. |
result | FLOAT | Score achieved. |
correct_answers | INTEGER | Number of correct answers. |
wrong_answers | INTEGER | Number of wrong answers. |
answers | JSONB | Full answers payload. |
created_at | TIMESTAMPTZ | |
deleted_at | TIMESTAMPTZ |
Patterns
sql
-- Pass vs. fail in the last 30 days
SELECT
CASE WHEN result >= min_score THEN 'pass' ELSE 'fail' END AS status,
count(*)
FROM lms.exam_results
WHERE is_finished = TRUE
AND is_discarded = FALSE
AND deleted_at IS NULL
AND created_at >= now() - interval '30 days'
GROUP BY 1;For executive view, use
metrics.daily_counters— columnsexams_passedandexams_failed.