Interview Q&A + Day-Of
~35 questions across all areas, plus behavioral and day-of tactics. Turn on drill mode, answer out loud before revealing, mark what you've practiced. The answers model the founding-hire register from chapter 01.
Founding-hire & judgement
Q1. What would you do in your first 90 days as our first data hire?
Model answer
Lead with the principle: optimize for trust and my own time as a team of one. Then the sequence: listen (stakeholder discovery — what do founders re-check in spreadsheets?) → centralize (warehouse + managed ingestion for top sources) → one trusted metric end-to-end by day 30 (likely revenue), tested and documented → expand the trusted core (30–60) with reconciliation and alerting → durability (60–90): docs, self-serve, a backlog. Name what I'd deliberately defer (streaming, ML) and the trigger to revisit. See chapter 08.
Q2. How do you prioritize when everyone wants something and you're alone?
Model answer
Tie every request to a decision it drives; requests with no decision get parked. Rank by value × reversibility, and favor the cheap version first (offer a 1-day version of a 3-week ask). Be willing to say "not yet" with a reason. Make the backlog visible so prioritization is transparent, not personal.
Q3. Build vs buy — how do you decide?
Model answer
Buy the undifferentiated heavy lifting (connectors, warehouse, BI, scheduling); build what's specific to the business (metering models, metric definitions, reconciliation). Managed over self-hosted while I'm one person. Avoid resume-driven architecture — match the stack to the stage.
Q4. A stakeholder demands a real-time dashboard. You only have batch. What do you say?
Model answer
Ask what decision needs sub-daily latency — often the real need is "fresh by morning," not real-time. If daily numbers aren't trusted yet, real-time just makes us wrong faster. Propose nailing batch first, offer micro-batch as a middle ground, and reserve true streaming for a decision that genuinely depends on sub-minute data. Constructive "not yet."
Q5. How would you measure your own success here?
Model answer
Trust: leadership stops maintaining shadow spreadsheets. Decisions enabled by data that weren't before. Time-to-answer dropping for common questions. And a leading indicator of reliability: I find data issues before stakeholders do. Dashboards are outputs; trusted decisions are the outcome.
SQL
Q6. Difference between WHERE and HAVING?
Model answer
WHERE filters rows before grouping; HAVING filters groups after aggregation. Push filters into WHERE when possible — correct and faster. You can't reference an aggregate in WHERE because it runs before GROUP BY (logical query order).
Q7. RANK vs DENSE_RANK vs ROW_NUMBER?
Model answer
All assign ordered positions within a partition. ROW_NUMBER is always unique (1,2,3,4 — arbitrary tiebreak). RANK leaves gaps after ties (1,2,2,4). DENSE_RANK has no gaps (1,2,2,3). Use ROW_NUMBER for dedup/latest-per-group, DENSE_RANK for "Nth distinct value."
Q8. Why might a LEFT JOIN behave like an INNER JOIN?
Model answer
A filter on the right table in WHERE drops the NULL rows that LEFT JOIN produced for non-matches, effectively making it inner. Fix: move the condition into the ON clause so unmatched left rows survive (chapter 02).
Q9. What's the NOT IN + NULL trap?
Model answer
If the subquery returns even one NULL, NOT IN returns no rows, because x <> NULL evaluates to unknown for every row. Use NOT EXISTS or a LEFT JOIN ... WHERE right IS NULL anti-join, which are NULL-safe.
Q10. How do you find the latest record per group?
Model answer
ROW_NUMBER() OVER (PARTITION BY key ORDER BY updated_at DESC, id DESC) then filter = 1 — with a deterministic tiebreaker so it's stable. Or QUALIFY in Snowflake/BigQuery. Avoid MAX + self-join (breaks on ties, slower).
Q11. Explain the gaps-and-islands trick.
Model answer
Subtract a row number (ordered by date) from the date. For consecutive dates both increase by 1, so the difference is constant within an unbroken run — group by that constant to collapse each streak. Then aggregate for start/end/length.
Q12. How do you avoid join fan-out inflating a SUM?
Model answer
Aggregate the one-to-many side to the join grain first (in a CTE), then join. Or declare the result grain and check row counts before/after the join. Reaching for DISTINCT to fix it is a smell — it hides the real grain bug.
Q13. How would you make a query cheaper on a columnar warehouse?
Model answer
You pay for bytes scanned: select only needed columns (no SELECT *), filter on the partition column, partition by date and cluster by a common filter key (e.g. customer), and pre-aggregate hot rollups. Avoid functions on the partition column in WHERE.
Pipelines
Q14. What is idempotency and why does it matter?
Model answer
A pipeline is idempotent if re-running it yields the same correct result. It matters because jobs fail and get retried/backfilled — without idempotency, retries duplicate or corrupt data. Achieve it with delete-insert by partition, MERGE on a key, and deterministic transforms.
Q15. ETL vs ELT — which and why?
Model answer
ELT for modern cloud warehouses: land raw, transform in-warehouse with versioned SQL/dbt. Preserves raw to re-transform without re-extracting, and keeps logic in one tested place. Pre-transform (ETL-style) only for PII you can't land or volumes you must filter for cost.
Q16. How do you design an incremental model, and what's the common bug?
Model answer
Process only rows above a high-water mark (max updated_at), with a small lookback window to catch late/updated rows. The classic bug is keying on created_at when rows can be updated later — you miss updates. Use a column that moves on every change, plus a unique key for upsert.
Q17. How do you handle late-arriving / out-of-order data?
Model answer
Aggregate by event time (not ingestion time) for correctness, reprocess a lookback window so late events fold into the right period, and document a finality cutoff (e.g. data > 7 days old is final) to bound recomputation. Track ingestion time too for debugging.
Q18. A source adds/renames a column. How do you not break?
Model answer
Land raw as semi-structured (JSON/VARIANT) so ingestion survives new fields; promote fields to typed columns deliberately in staging. Additive changes are safe; for breaking ones, a schema test fails loudly at ingest as a tripwire, and ideally a data contract with the producer (chapters 04/05).
Q19. Would you set up Airflow on day one?
Model answer
No — that's ops overhead for one person and a handful of pipelines. Start with a managed scheduler (dbt Cloud) or Dagster for its asset model and local dev. Move to heavier orchestration only when DAG complexity demands it. Match tooling to stage.
Data quality
Q20. The CEO says "revenue looks wrong." Walk me through it.
Model answer
Reproduce and quantify (which number, how wrong, since when). Check whether it's the data or the definition — half are definition mismatches, cheapest to rule out first. Then walk the pipeline top-down via lineage: source freshness/volume → staging dedup → join fan-out → metric logic → BI filter. Reconcile to the billing source of truth. Communicate throughout, fix idempotently, and add a test so it can't recur silently.
Q21. What are the dimensions of data quality?
Model answer
Freshness, volume, completeness, uniqueness, validity, consistency, accuracy. For a solo hire, freshness + volume + key-uniqueness on the few trusted metrics is most of the value for least effort (chapter 05).
Q22. Where in the pipeline do you put tests?
Model answer
At the boundaries, not everywhere. Source/ingest: schema + freshness. Staging: dedup-key uniqueness, not-null, valid enums. Marts: grain uniqueness, FK to dimensions, business invariants, reconciliation. Shift-left: catch issues as early as possible.
Q23. What's a data contract, and can you really enforce one at a startup?
Model answer
An agreement with producers on schema/types/semantics/SLA so a backend deploy doesn't silently break analytics. Formal enforcement (schema tests, dbt contracts) is ideal; pragmatically at a startup it's a schema test that pings me on change plus a lightweight "tell me before you rename a field." Show you know both ideal and pragmatic.
Q24. How do you catch a feed that silently stopped?
Model answer
Freshness check (max load time within SLA) and volume check (today's rows within a band of the trailing average, accounting for seasonality). These two catch most real-world silent breaks for minimal effort. Route Tier-1 failures to a page, softer ones to a channel.
Modeling
Q25. What's the grain of a table and why declare it first?
Model answer
What one row represents. Everything — keys, joins, aggregations, tests — follows from it. Pick the finest grain you'll need for a fact (you can roll up, not down). A mixed-grain table silently breaks every aggregate.
Q26. Explain SCD Type 2 and when you'd use it.
Model answer
A new dimension row per change, with valid-from/valid-to and an is_current flag, so you can join facts to the attribute value that was active at the time. Use it when point-in-time truth matters (bill at the plan tier active when usage occurred). Don't SCD2 everything — it bloats dims and complicates joins; reserve it for attributes whose history matters. dbt snapshots implement it.
Q27. Star schema vs One Big Table — which do you pick?
Model answer
Both: model the core as a star (conformed dimensions, clean facts, reusable logic) and materialize wide OBT marts on top for specific dashboards (ergonomics, no fan-out for analysts). Pick per consumer, not as a religion.
Q28. Normalized vs denormalized — when each?
Model answer
Normalized for OLTP/source systems (writes, integrity, no duplication). Denormalized for analytics (read speed, simplicity) — columnar warehouses make wide tables cheap to scan. Denormalize marts but keep conformed dimensions so logic isn't duplicated.
Q29. Event log vs current-state table — how do you model entity lifecycle?
Model answer
Keep the append-only event log as source of truth (you can rebuild state from events, never the reverse) and materialize current-state and daily-snapshot tables on top for fast querying. That's the event-sourcing intuition.
Q30. Which modeling decisions are expensive to reverse?
Model answer
One-way doors: the grain of a core fact, whether a key dimension is SCD2, identity/key strategy, what raw data you retain. Cheap to change: derived columns, new marts, non-breaking renames, a one-off OBT. Spend judgement proportional to reversibility — capture finest grain and full history on the one-way doors even if not needed yet.
Domain
Q31. How would you model usage and billing for a usage-based compute marketplace?
Model answer
A transaction fact at instance-hour grain (gpu_seconds, cost) with keys to dim_customer, dim_instance_type, dim_region, dim_date. SCD2 on plan/pricing so usage bills at the rate active at the time. Keep the telemetry event log as truth; materialize daily usage and a metering↔billing reconciliation. Test grain uniqueness, FK integrity, and metered-vs-invoiced consistency (chapters 06/07).
Q32. What's the trickiest correctness risk in metering?
Model answer
Metering errors are revenue errors. Risks: duplicate heartbeats (at-least-once → over-bill, fix with dedup), missed heartbeats/gaps (define the billing rule), partial-hour rounding (small rules move big money at scale), and clock skew/late data (aggregate by event time with lookback). Make all rules explicit and testable.
Q33. How would you compute fleet utilization, and what's the subtle part?
Model answer
Rented GPU-hours ÷ available GPU-hours per day, using a generated date spine + LEFT JOIN so zero-rental days still appear. The subtle part is defining the denominator (include machines in maintenance? offline hosts? reserved-idle?) — the choice changes the number, so pick one and document it. Segment by GPU type/region to find stranded supply.
Behavioral
Q34. Tell me about a time you owned something ambiguous end-to-end.
How to answer
Use STAR and pick a story where you set the scope (no one handed you a spec) — this is the founding-hire signal. Emphasize: how you found the real problem via stakeholder conversations, how you sequenced, a tradeoff you made deliberately, and the measurable outcome (a trusted number, a decision enabled). Show comfort operating without a manager defining the work.
Q35. Tell me about a time you pushed back on a request.
How to answer
Pick a case where you said "not yet" or offered the cheap version, tied to a decision, and it led to a better outcome — not stubbornness. Shows judgement and that you won't just build whatever's asked into an unmaintainable pile. Land it on the result and the relationship preserved.
Day-of tactics & traps
- Clarify before you code or design. Restate the grain and edge cases. Confirming "one row per customer per day, zero for inactive — right?" prevents the most common failures.
- Narrate. Think out loud in SQL and design. Silence reads as being stuck; narration shows reasoning even when you pause.
- Sanity-check your own output. "Let me confirm row counts didn't explode." Self-checking is the whole job as a solo hire — show the habit.
- Answer in the founding-hire register. Sequence, tradeoff, reversibility, trust. Don't give big-company "I'd have a team build X" answers.
- If stuck, state your approach anyway. "I'd reach for a window function here — let me reason through the partition" earns credit even before the syntax lands.
- Trap: feature-dumping the roadmap. Always sequence and justify the order.
- Trap: tool-first answers. Lead with the question/decision, then the tool.
- Trap: over-engineering. No Kafka/lakehouse/feature-store for three data sources.
- Recovery: if you give a weak answer, it's fine to say "actually, let me reconsider — a cleaner approach is…". Self-correction is a senior trait, not a weakness.
Questions to ask them (signal seniority)
- "What decisions are you making today without the data you wish you had?" — surfaces the real mandate.
- "Which numbers does leadership currently track in spreadsheets, and do you trust them?" — finds your day-30 win.
- "What does the data landscape look like today — sources, any warehouse, who's been doing analytics?"
- "How will you judge whether this hire is working in six months?" — aligns on success.
- "What's the appetite for build-vs-buy and tooling spend?" — calibrates your stack proposals.
- "Where does data sit relative to engineering and the founders?" — reveals influence and support.
- "What's the plan for the second data hire?" — shows you think about scaling the function.
Closing statement
"What excites me about being your first data hire is owning the function end-to-end — but my bias is to earn trust before breadth. In the first month I'd get one number leadership cares about into a dashboard they believe, with tests and docs behind it, so it stops living in a spreadsheet. Then I'd expand deliberately, buying the boring parts and building what's specific to your business. I'm comfortable with the ambiguity, and I sequence by value and reversibility rather than trying to build everything at once."
That single paragraph demonstrates every theme of this guide: judgement, sequencing, trust as the deliverable, and founding-hire pragmatism. Re-read chapter 01 the morning of. Good luck.
✓ Check yourself
Answer from memory before opening each one.
-
Two analysts count daily active customers from the same table and get 1,204 and 1,310. Name the two likeliest causes before you touch the pipeline.
Show answer
A definition mismatch, such as what counts as active or which time zone sets the day boundary, and a grain problem, such as a join that fans out one analyst's count. Check the definition first because it is cheap, then count rows before and after each join. See the data quality questions.
-
A logic fix means you must reload last week. The load script is INSERT ... SELECT with no delete. What happens when you run it, and what is the minimal change?
Show answer
Last week's rows are doubled, because the load appends. Wrap a delete of the target partitions and the insert in one transaction, or use MERGE on a key, so a re-run replaces the data. See the pipeline questions.
-
An instance can run across midnight. At what grain do you store usage so that daily revenue is right, and which timestamp assigns the day?
Show answer
Store at a fine grain such as instance-hour or instance-minute and assign each interval by its event time. Midnight-spanning runs split into the intervals on each side, and daily or monthly figures roll up from there. See the modelling questions.
-
Your latest-per-customer query uses RANK() = 1 and some customers return two rows. Why, and what is the fix?
Show answer
RANK gives tied rows the same rank, so two rows with the same timestamp both get 1. Use ROW_NUMBER with a deterministic tiebreaker such as the id. See the SQL questions.
-
You have time for one task before Friday's board meeting: speeding up a dashboard, or adding reconciliation between metering and billing. Which, and what do you tell the requester?
Show answer
Reconciliation, since the board is about to act on revenue, and a slow dashboard costs seconds while a wrong number costs credibility. Tell the requester the dashboard is next and why, and offer a cheap speed-up such as a pre-aggregated table if it is quick. See founding-hire and judgement questions.
Takeaway
- Answer in the founding-hire register: clarify the decision, state the sequencing principle, stage the plan, name the tradeoff and say how you will know it worked.
- Rehearse the recurring technical points: declare the grain, avoid fan-out, make loads idempotent, check freshness and volume, use Type 2 where history matters, and define the utilization denominator.
- Narrate as you work, sanity-check row counts, and state your approach when the syntax stalls.
- Avoid the three traps: listing every feature, leading with tools, and over-engineering for three data sources.
- The questions you ask the interviewers show whether you can find the mandate.
- Close on trust before breadth, with one number the company believes.
To go further on the design questions that follow a loop like this, continue with system design for data platforms. → Data Systems Design