datalint: sample shop data
Contract checks plus zero-config semantic checks: does each column mean what its name says?
Health40.7%
Checks passed11/27
Errors12
Warnings4
Tables · rows2 · 1,200
Issues
| Severity | Where | Rule | Rows | Problem | Examples |
|---|---|---|---|---|---|
| error | customers.country | allowed contract | 2 | must be one of ['US', 'CA', 'GB', 'DE', 'IN', 'AU'] | XX; UK |
| error | customers.email | regex contract | 6 | must match /^[^@\s]+@[^@\s]+\.[^@\s]+$/ | priya111@example; emma54@@example.com; n/a |
| error | orders | total_matches_items contract | 5 | total = quantity × unit_price × (1 − discount), within 1 cent | order_id=O00100, quantity=5, unit_price=70.31, discount_pct=10.0, total=632.8; order_id=O00318, quantity=2, unit_price=62.14, discount_pct=15.0, total=95.08; order_id=O00467, quantity=5, unit_price=50.07, discount_pct=15.0, total=191.52 |
| error | orders.customer_id | not_null contract | 5 | must not be null | null |
| error | orders.customer_id | references contract | 4 | must exist in customers.customer_id | C0939; C0978; C0942 |
| error | orders.discount_pct | semantic:mixed_scale semantic | 60 | name implies a percentage, but 60 values look like fractions (0–1) and 528 like percents (1–100) | 0.1; 0.15; 0.2 |
| error | orders.order_date | type:date contract | 6 | must parse as an ISO date (YYYY-MM-DD) | 07/10/2026; 05/26/2026; 08/22/2026 |
| error | orders.order_date | max contract | 2 | no dates after today | 2031-02-14; 2030-11-30 |
| error | orders.order_date | semantic:unparseable_dates semantic | 6 | name implies a date, but 6 values aren't ISO dates (mixed formats force the whole column to text) | 01/21/2026; 04/29/2026; 07/10/2026 |
| error | orders.order_id | unique contract | 6 | values must be unique | O00184; O00402; O00437 |
| error | orders.quantity | min contract | 2 | min 1 | -2; -5 |
| error | orders.status | allowed contract | 3 | must be one of ['placed', 'shipped', 'delivered', 'returned', 'cancelled'] | shiped |
| warn | customers.email | semantic:invalid_email semantic | 6 | name implies an email address, but some values aren't valid | ava149@@example.com; priya111@example; mia74@@example.com |
| warn | orders.order_id | semantic:id_not_unique semantic | 6 | looks like this table's identifier, but values repeat | O00184; O00437; O00402 |
| warn | orders.quantity | semantic:count_not_whole semantic | 2 | name implies a count, but values are negative or fractional | -5; -2 |
| warn | orders.total | semantic:negative_money semantic | 2 | name implies money, but some values are negative (refunds should be explicit) | -112.9; -311.9 |
Notes
orders.region_avg_price: name implies a pre-aggregated statistic (an average across many records). It is fine for comparisons, but don't use it as a per-record value
Profiles
customers 200 rows
| Column | Type | Null | Distinct | Min | Max | Mean | Most common |
|---|---|---|---|---|---|---|---|
customer_id | VARCHAR | 0.0% | 200 | C0001 | C0200 | C0001, C0002, C0003 | |
email | VARCHAR | 0.0% | 200 | arjun127@example.com | zoe88@example.com | arjun127@example.com, arjun136@example.com, arjun137@example.com | |
country | VARCHAR | 0.0% | 8 | AU | XX | US, AU, GB | |
signup_date | DATE | 0.0% | 160 | 2025-01-04 | 2026-02-05 | 2025-02-05, 2025-05-16, 2025-05-23 |
orders 1,000 rows
| Column | Type | Null | Distinct | Min | Max | Mean | Most common |
|---|---|---|---|---|---|---|---|
order_id | VARCHAR | 0.0% | 997 | O00001 | O01000 | O00184, O00402, O00437 | |
customer_id | VARCHAR | 0.5% | 203 | C0001 | C0978 | C0016, C0098, C0100 | |
order_date | VARCHAR | 0.0% | 274 | 01/21/2026 | 2031-02-14 | 2026-04-24, 2026-07-03, 2026-07-23 | |
status | VARCHAR | 0.0% | 6 | cancelled | shipped | cancelled, returned, shipped | |
quantity | BIGINT | 0.0% | 7 | -5 | 5 | 3.112 | 4, 5, 3 |
unit_price | DOUBLE | 0.0% | 930 | 5.05 | 79.81 | 41.95 | 28.2, 55.79, 57.78 |
discount_pct | DOUBLE | 0.0% | 9 | 0 | 20 | 6.968 | 0, 15, 20 |
total | DOUBLE | 0.0% | 977 | -311.9 | 632.8 | 119.8 | 7.18, 18.61, 20.76 |
region_avg_price | DOUBLE | 0.0% | 3 | 29.1 | 41.2 | 36.35 | 41.2, 29.1, 38.75 |