Practice Interview Questions
~25 questions across 7 categories, calibrated to a founding-DAE screen. 90 seconds per answer.
Section A · Background / motivation
Q1. "Walk me through your background."
Show answer
Edge → one specific project → bridge to this role anchored to a JD line → honest gap with closing plan. See 02-positioning for the through-line shape.
Q2. "Why this company specifically?"
Show answer
Anchor to one specific JD line and one specific thing in your trajectory. "The 'first analytics hire' framing — I've been the second or third hire and I want to be the one defining the metric vocabulary, not inheriting it. GPU marketplace is interesting because two-sided marketplaces are the analytical pattern I've gotten most fluent on, applied to a domain that's genuinely new to me."
Q3. "Tell me about a time your analysis changed a decision."
Show answer
STAR. Situation → task → action (lead with the framing decision and the alternative you discarded) → result (measurable, decision changed). The alternative-you-considered beat is what reads senior.
Q4. "Tell me about an analysis that was wrong."
Show answer
Have a real one. Not a near-miss. What you concluded → what you missed → how you found out → what you did → what changed in your process going forward. The last beat is the differentiator.
Section B · SQL concepts
Q5. "Difference between ROW_NUMBER, RANK, DENSE_RANK."
Show answer
ROW_NUMBER: unique 1..N per partition, ties broken arbitrarily. RANK: ties share rank, next skips (1,2,2,4). DENSE_RANK: ties share rank, no skip (1,2,2,3). Use ROW_NUMBER for "exactly one row per group"; use RANK/DENSE_RANK when ties are real and you want them surfaced.
Q6. "Why does NOT IN sometimes return zero rows?"
Show answer
If the subquery returns any NULL, every NOT IN comparison evaluates to UNKNOWN, which filters everything. Default to NOT EXISTS for correlated lookups.
Q7. "How would you compute 7-day rolling DAU?"
Show answer
Daily distinct-user count as the base, then AVG() over ROWS BETWEEN 6 PRECEDING AND CURRENT ROW. ROWS counts rows, so fill missing days from a date spine first, or use a RANGE frame with an interval. COUNT(DISTINCT) in a window frame isn't supported in most dialects — workarounds include self-join with date windows, or HyperLogLog approximate counts in BigQuery/Redshift.
Q8. "When would you reach for a CTE vs a subquery?"
Show answer
CTEs for anything beyond two steps — they read top-to-bottom like prose and the CTE names document your thinking. Subqueries (especially correlated) when the logic is genuinely a filter and not a logical step. Caveat: in some warehouses, CTEs are re-evaluated on each reference; for expensive reused CTEs, materialize to a temp table.
Q9. "Why does LAST_VALUE return the current row?"
Show answer
The default window frame with ORDER BY is RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. LAST_VALUE over that frame returns the current row. Fix with explicit ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING, or refactor to a ranked subquery.
Section C · Data debugging
Q10. "A dashboard shows 12% MoM growth. The exec doesn't believe it. Walk me through what you'd check."
Show answer
Six checks. (1) Is the data complete? Sometimes the previous month is partial. (2) Did the definition change? A small SQL edit can shift a number meaningfully. (3) Did the denominator change? A growing user base inflates totals. (4) Is the data right? Run row counts at each CTE stage. (5) Slice by cohort/segment — is the growth uniform or one segment? (6) Compare against a second source if available. Report what you find honestly, including if the 12% holds up.
Q11. "Two dashboards report 'active customers' and disagree. What do you do?"
Show answer
Trace both definitions: what's the date window, what counts as "active" (any event vs gpu-session vs minimum threshold), how are bots/internal accounts handled. Find the divergence. Pick the right one. Kill the other. Communicate proactively — stakeholders likely noticed. Long-term: a metric layer (LookML, dbt semantic models) so this can't drift again.
Q12. "How do you spot a query that's been silently wrong for weeks?"
Show answer
Three habits. (1) Row-count sanity checks at every CTE — if a CTE has more rows than its input, that's a fanout. (2) Comparison against an alternative source — does the SQL match what the warehouse aggregator reports, or what an engineer would estimate? (3) Trend continuity — sudden jumps without product change are usually data, not reality. Build alerts on these into the dashboard layer.
Q13. "How would you proactively monitor data correctness?"
Show answer
Three layers. (1) Pipeline-level: dbt tests on freshness, uniqueness, not-null, accepted-values, row-count thresholds. (2) Metric-level: anomaly detection on the headline numbers (z-score, MAD, or seasonal decomposition). (3) Source-level: reconciliation against upstream (does our session count match the application logs from engineering?). Senior signal: naming all three layers and pointing out the third is the one most teams skip.
Section D · Pandas
Q14. "When would you use pandas vs SQL?"
Show answer
SQL for anything the warehouse can do well — joins, groupbys, window functions over large data. Pandas for non-SQL operations: text manipulation, complex feature engineering, time-series cleaning with row-level logic, ad-hoc analysis on intermediate results. The line: if you'd ship it, push to SQL; if it's exploratory, pandas. Mention DuckDB as a third option for SQL-on-DataFrames when pandas is awkward but SQL fits the shape.
Q15. "Why is .apply slow, and when is it OK?"
Show answer
.apply with a Python function is row-by-row and pays Python overhead per row — 10–100× slower than vectorized ops. OK when the function is genuinely complex (multi-line, branching, external lookups) and the DataFrame is small enough that clarity matters more than speed. Default to vectorization; use .apply with an explicit comment about why.
Q16. "Sketch how you'd compute customer cohort retention in pandas."
Show answer
(1) Build cohort_week column from signup. (2) Join cohorts to activity events; compute weeks_since per activity row. (3) Groupby (cohort_week, weeks_since) → unique customer count. (4) Divide by cohort size. (5) Pivot to a wide retention table (rows: cohorts, columns: weeks_since, values: rate). Mention the SQL alternative is much faster at scale and the result should be identical.
Q17. "How do you handle merging when the right table has duplicates?"
Show answer
Two options. (1) Aggregate the right side to one row per key before merging — the safer default. (2) Accept the fanout intentionally — but then check the resulting row count and verify it matches expectations. Always pass validate='m:1' or '1:1' when you expect uniqueness — pandas raises if it isn't, catches bugs early.
Section E · Dashboards & BI
Q18. "How do you decide what goes on a dashboard?"
Show answer
Start with the audience and the decision they're making. If a chart doesn't change a decision, it doesn't belong. Cap at ~7 charts per dashboard; otherwise readers scan and miss everything. Pair every metric with comparison context (WoW, MoM, YoY) — a bare number is noise.
Q19. "What do you think about Hex vs Metabase vs PostHog?"
Show answer
Hex: notebooks + dashboards in one — analyst-friendly, fast iteration. Metabase: open-source BI, good enough for early-stage. PostHog: product analytics specifically — funnels, retention, session replay, event tracking. At this stage I'd guess Hex or Metabase for general analytics, PostHog for product/usage funnels. Each has a niche; using all three for what they're each good at is reasonable.
Q20. "How would you structure a board-prep dashboard for a marketplace company?"
Show answer
Three sections. (1) Headline metrics: GPU-hours billed, revenue, take rate — current period vs prior, with trend chart. (2) Marketplace health: utilization by tier, fulfillment time, supplier and customer counts. (3) Cohorts and unit economics: retention curves, CAC/LTV, gross margin per GPU-hour. End with "open questions for the board" — analytical uncertainties leadership should weigh in on. Avoid vanity metrics like cumulative signups all-time.
Section F · Domain (GPU / marketplace)
Q21. "What's the difference between H100 and A100 from a business standpoint?"
Show answer
H100s are scarcer, more expensive, demanded by training workloads (large models). A100s are workhorses — broader use, more elastic supply. Analytical implications: H100 utilization should run hotter; H100 supplier churn is more material; price elasticity differs sharply by tier. Treating them identically in the metric system misses where the levers are.
Q22. "What metric tells you the marketplace is healthy?"
Show answer
No single one. The closest single number is utilization-by-tier weighted by tier revenue. But the senior answer pairs it with fulfillment time (leading indicator of liquidity) and cohort retention on both sides (long-term health). One number masks the trade between supply and demand growth.
Q23. "What's batching, and why does it matter for pricing inference?"
Show answer
Inference servers process multiple concurrent requests in one GPU forward pass — much better GPU utilization. Batch size of 16 vs 1 can yield 5–10× higher throughput, lower per-request cost. Implication: cost per request drops sharply with concurrent demand. Two customers running at low concurrency are far more expensive than one running at high. Pricing should reflect that — usage-based pricing with volume discounts isn't a sales trick, it's the unit economics.
Section G · Curveballs
Q24. "Suppose GPU-hours billed are up 20% but revenue is flat. What's happening?"
Show answer
Hypotheses, in order of likelihood. (1) Tier mix shifted toward cheaper GPUs (more A10s, fewer H100s) — check tier composition. (2) Pricing changed — discounts or promotional pricing. (3) Currency / billing-cycle issues — revenue recognition lagging hours billed. (4) Data bug — hours billed is overcounting (duplicates, leaked test traffic). Investigate in that order; report what you find with a concrete recommendation.
Q25. "What would you build in your first 30 days?"
Show answer
Don't list infrastructure. Lead with the question: "I'd spend week one in customer + supplier conversations to learn what leadership doesn't trust about the data today. Then I'd build the three or four metrics that map to current decisions, with definitions documented and source-of-truth captured in a dbt-style layer. Then start retiring whatever dashboards disagree with those metrics." Senior signal: starting with the question, not the infrastructure.
Drill protocol
Enable drill mode. Read each question. 90-second timer. Speak the answer out loud. Reveal. Compare. Mark practiced. Aim for 18+/25 before the loop. Reread the strong-answer phrasing for the ones you stumbled on.
✓ Check yourself
Answer from memory before opening each one.
-
A dashboard shows revenue up 12% month over month and an executive doubts it. Which two checks do you make first, and what does each rule out?
Show answer
Whether the prior month is complete, since a partial base month inflates growth, and whether the metric definition changed between the periods. Then check the denominator, row counts at each stage and whether one segment drives the growth. See data debugging.
-
Two dashboards report active customers as 5,120 and 4,870. Why trace both definitions before deciding which is right?
Show answer
The gap usually comes from different windows, different events counted as active, or internal accounts included in one. Until you know the cause you cannot say which is wrong, and you may be picking an arbitrary one. After finding it, kill one and move the definition into a shared layer. See data debugging.
-
Why is a seven-day rolling distinct count awkward in SQL, and what are your options?
Show answer
Many engines, including PostgreSQL, reject DISTINCT inside a window function. Join each day to the previous six days and count distinct users, or use approximate distinct counts. See SQL concepts.
-
You have a 400M-row session table in the warehouse and a 20,000-row file of support notes to clean. Which tool for each?
Show answer
Do the session aggregation in SQL on the warehouse, since the data is large and the result would ship. Use pandas for the notes, where row-level text logic is awkward in SQL and the data is small. DuckDB is a middle option when SQL fits a local DataFrame. See pandas.
-
GPU-hours billed are up 20% but revenue is flat. List the hypotheses in order and name the first query you run.
Show answer
Tier mix shifted to cheaper GPUs, then pricing or discounts changed, then revenue recognition lags billing, then a data bug inflates hours. The first query is hours and revenue by tier and week, which tests mix and price at once. See curveballs.
Takeaway
- Know SQL ranking, NULL and window-frame behaviour well enough to explain the mechanism, not just the fix.
- When a number is disbelieved, check completeness, definition, denominator and row counts before blaming the business.
- Disagreeing dashboards are resolved by tracing both definitions, then keeping one in a shared metric layer.
- The pandas versus SQL choice follows data size and whether the work will ship.
- Monitoring correctness has three layers: pipeline tests, metric anomaly checks and reconciliation against the source.
- Curveballs reward an ordered list of hypotheses and a first query to test them.
The last chapter covers how to run the session itself on the day. → Day-Of Tactics