SQL, grain, BI
Data Analyst
SQL you can defend, a metric someone will argue with, and a BI-shaped interview loop.
One problem list for Python and SQL, split into paths for analysts, BI, analytics engineers, data engineers, scientists, ML, MLOps, AI engineers, and architects. On a Python problem, pick NumPy, Python, or PyTorch from the chips — same two-pane layout as SQL. Tests run in this tab.
Your progress
0/60
Progress and last editor contents are stored in this browser only.
One problem list for all nine DataLane roles. Open a card for coding, or jump to that role's roadmap and interview track. Easy pads are free; medium and hard unlock with Pro.
SQL, grain, BI
SQL you can defend, a metric someone will argue with, and a BI-shaped interview loop.
Dashboards, grain, warehouse
Warehouse SQL at dashboard grain. Windows, ranking, and a refresh that does not lie.
dbt, tests, metrics
Mart SQL, tests that page someone, and a metric finance can trust.
Pipelines, warehouses, on-call
SQL, orchestration, streaming, and the platform sketch they ask at 3pm.
SQL, stats, experiments
SQL for features, stats without vibes, and a holdout you would defend.
Train, serve, rollback
Features as tables. Latency as an SLA. Metrics you can put in CI.
Gates, serving, incidents
The SQL that proves training and serving agree, then the gate that blocks a bad model.
RAG, eval, retrieval
Retrieval is a pipeline. Eval is a job. The model brand is not the incident.
Grain, cost, paved roads
You still have to query the mart you designed. Quality SQL and a time you said no.
Ordered SQL warehouse sets and Python (NumPy / PyTorch) sets. Filter by role on the tracks page.
SQL · 5 problems
The eight-minute questions that open a screen: filtered aggregation, product joins, and the org-tree self-join.
0/5 solved
SQL · 4 problems
The everyday warehouse screen: anti-joins, rates, daily grain, and a customer dimension that survives LEFT JOIN.
0/4 solved
SQL · 4 problems
Running totals, trailing averages, growth, and share of total — every question here turns on the frame.
0/4 solved
SQL · 3 problems
Latest row per key, top-N per group, and the department-average trap. ROW_NUMBER earns its keep here.
0/3 solved
SQL · 11 problems
Reconciliation, JSON payloads, pivots, median without percentiles, and sessionization. The back half of the loop.
0/11 solved
Python · 6 problems
The pad that opens an analyst or DE screen: means, activations, clip, flatten. Same tests in NumPy, Python, and PyTorch.
0/6 solved
Python · 7 problems
NaN-aware means, variance, median, z-score, and a weighted KPI. Spreadsheet instincts, code you can defend.
0/7 solved
Python · 7 problems
Losses and scores a scientist or ML engineer must implement without sklearn: MSE, R², precision, recall, F1, BCE.
0/7 solved
Python · 8 problems
Softmax, log-softmax, cosine, top-k, KL, Huber — the DS/MLE follow-up after the metric pad.
0/8 solved
Jump straight to the pattern you keep failing.
Aggregation
GROUP BY, HAVING, conditional sums.
Joins
Grain, fan-out, and self-joins.
Anti-joins
Missing rows without the NOT IN trap.
Window functions
Running totals, LAG, frames.
Ranking
ROW_NUMBER, top-N per group.
Deduplication
Latest row per key.
Time series
Daily grain, growth, moving averages.
Sessionization
Inactivity gaps into session ids.
Pivot
Rows to columns with conditional aggregation.
Semi-structured
JSON payloads inside event tables.
Data quality
Reconciliation and duplicate detection.
Subqueries
Correlated and scalar subqueries.
Statistics
Median, percentiles, distribution.
Every SQL problem and the sandbox share these tables.
orders
~200 rows
Order headers. One row per order, so amount is the order total — not a line total.
customers
~12 rows
Customer dimension. Every customer has at least one order in this seed.
order_items
~250 rows
Order lines. Some orders carry two lines, which is what makes header joins fan out.
products
~5 rows
Product dimension across three categories.
payments
~182 rows
Settlements. Cancelled orders have no payment row, which is the anti-join case.
events
~400 rows
Clickstream. payload is raw JSON — use json_extract on it.
employees
~8 rows
Org tree. manager_id points back at employee_id in the same table.