Data Investigation and Root Cause Analysis Questions
Diagnosing why a metric moved. Covers structured drill-down, segmentation to isolate drivers, distinguishing real shifts from noise or data artifacts, and forming and testing explanatory hypotheses. Focuses on the investigative reasoning behind metric-change and anomaly questions.
Two systems (for example two dashboards, or a dashboard versus raw event logs) report different numbers for what should be the same metric. Walk through a systematic reconciliation approach: what you check first, how you decide which source is authoritative in the short term while you fix the root cause, and how you'd present the reconciliation and a permanent fix to the teams that rely on each number.
Sample Answer
Direct answer. Two dashboards (or a dashboard versus raw event logs) reporting different numbers for what should be the same metric is one of the most common data-investigation tasks, and it's almost always caused by a difference in DEFINITION or SCOPE, not by one side being simply wrong: different metric definitions, different timezones, different filters, different data freshness, different join logic, or different aggregation windows.
Structured elaboration. A systematic reconciliation walks through these in order of how often each one is the actual cause: (1) Metric definition - do both sides define the metric identically (does 'active user' mean the same session, event, or login threshold in both places)? This alone explains a large share of real-world discrepancies. (2) Timezone and date boundaries - are both systems truncating timestamps to the same timezone and using consistent inclusive/exclusive boundaries for 'today'? (3) Filters - does one system silently exclude bots, internal test accounts, or a specific platform that the other includes? (4) Freshness - is one number computed on a still-loading, partially-arrived dataset while the other waited for late-arriving data to settle? (5) Join and aggregation logic - does a join between two tables in one pipeline introduce duplication or drop rows the other pipeline doesn't? Deciding which source is authoritative in the short term should be based on which one is closer to the RAW, least-transformed data and which has the more defensible, documented definition, not which number is more convenient. The permanent fix is documenting one canonical definition and either making both systems compute from it or clearly labeling the difference if both are legitimately answering different questions.
Worked example. Weekly active user counts: Dashboard A shows 1.2M, Dashboard B shows 1.35M for the same week. Checking definitions first: Dashboard A counts a 'user' as a unique authenticated user ID; Dashboard B counts a unique device ID, which double-counts users who are logged in on two devices. That single definitional difference, verified by checking the fraction of users with more than one device ID in a sample, explains essentially the entire 12% gap without needing to dig into timezone or join logic at all.
Trade-offs and pitfalls. The instinct to jump straight to 'one of these must be a bug' skips the much more common and much cheaper-to-check explanation, a definitional or scope difference; always rule that out with a quick side-by-side comparison of documented definitions BEFORE debugging pipeline code. When presenting the reconciliation to teams who each trust their own number, lead with the specific mechanism (not 'your number is wrong') and propose the canonical definition going forward as the fix, since the goal is alignment, not assigning blame.
A key business KPI (for example daily active users) drops 30% overnight. Walk through a rigorous end-to-end investigation: how you determine whether the cause is a data-quality/ETL issue, a product or release change, or a genuine shift in user behavior; the prioritized checks and SQL you'd run at each layer; which stakeholders you'd bring in and when; and how you'd report your conclusion.
Sample Answer
Direct answer. A rigorous end-to-end investigation of a sharp overnight KPI drop works outward from the data itself: first confirm the number and rule out a data or pipeline cause, then check whether a product or engineering change coincides with the drop, and only conclude a genuine user-behavior shift once the first two are ruled out, because that ordering matches how often each cause turns out to be true in practice and avoids chasing an expensive product investigation for what's actually a tracking bug.
Structured elaboration. A concrete layered process: Layer 1, data integrity - compare the metric against an independent source, check for schema changes, failed or delayed pipeline runs, and duplicate or missing events around the drop window; if the raw event counts are intact but the AGGREGATE number is wrong, the bug lives in a transformation or dashboard query, not upstream. Layer 2, deployment and release correlation - check the release log, feature-flag changes, and any infrastructure or third-party dependency changes (a content delivery network, an SDK (software development kit), a payment provider) in the hours immediately before the drop; a change that lines up in TIME with the drop is a strong candidate, but time-correlation alone isn't proof, so also check whether the drop is concentrated in exactly the population that change would affect (a specific platform, a specific rollout percentage). Layer 3, segmentation - break the drop down by platform, geography, and acquisition channel; a drop spread evenly everywhere without a clear release correlate is the pattern most consistent with an external cause (a competitor action, a holiday, a macro event) or a genuine, broad product regression. Layer 4, confirm and report - once a hypothesis survives the above, state it with the specific evidence, note remaining uncertainty, and identify who needs to act (engineering to roll back, product to investigate further, or nobody if it resolves itself).
Stakeholder sequence. Bring people in as each layer produces evidence, not all at once: loop in data or analytics engineering at the very start of Layer 1, since they can confirm or rule out a pipeline cause fastest and doing this first avoids escalating what might be a tracking bug to product or leadership as if it were a business problem; bring in the release-owning engineering team as soon as Layer 2 turns up a correlated deploy or flag change, so they can start assessing a rollback in parallel with the Layer 3 segmentation work rather than waiting for full certainty; and loop in business or executive stakeholders once Layer 3's segmentation gives a directionally confident read, even before Layer 4's full confirmation, if the KPI carries direct revenue or user-trust implications, explicitly flagging that read as preliminary rather than final.
Worked example. Daily active users (DAU) drops 30% overnight. Layer 1: raw event table row counts for the affected day are intact and roughly match a spot-check against server access logs, so the drop isn't a pipeline artifact (data/analytics engineering, looped in first, confirms this within the first 20 minutes). Layer 2: a mobile app release went out 4 hours before the drop began, so the release-owning engineering team is looped in next. Layer 3: the drop is concentrated almost entirely in iOS users on the new app version; Android and web are flat. That combination, a release-timed drop concentrated in exactly the population the release touched, is strong enough evidence to recommend an immediate rollback while a deeper root cause (likely a crash or a broken login flow in the new build) is investigated in parallel; leadership is looped in at this point with a preliminary read, rather than waiting for full certainty before acting.
Trade-offs and pitfalls. A drop where TRAFFIC (top-of-funnel exposure) is unchanged but a downstream action collapses is a materially different signature than a drop where traffic itself fell, and conflating the two leads to the wrong team getting paged; always separate 'fewer people showed up' from 'the same people showed up but stopped completing X.' The bar for recommending an immediate rollback should be evidence strength, not certainty: a release-timed, population-matched signal is usually enough to justify a rollback even before the exact code defect is found, since a rollback is cheap to reverse if wrong and the drop is expensive to leave live if right.
Two independent systems that should agree on a headline business number (for example revenue, active users, or margin) report meaningfully different totals for the same period. Provide a reconciliation plan: which fields and dimensions you would compare across the two sources, the categories of root cause you'd rule in or out, and how you would explain the discrepancy and a fix to Finance or another non-technical audience that already distrusts the numbers.
Sample Answer
Direct answer. When two independent systems disagree on a headline number like revenue or margin, at finance or executive stakes, the reconciliation has to be more rigorous and more carefully communicated than an ordinary dashboard mismatch: the audience already distrusts both numbers, real financial decisions may depend on the answer, and 'we're not sure yet' is a much more costly thing to say to a CFO than to a product manager.
Structured elaboration. Compare the same fields and dimensions across both sources at the most granular level available (individual transactions or line items, not just the aggregate), looking specifically for: attribution-window differences (does one system count a sale on the order date and the other on the ship or payment-settlement date), timezone and period-close-cutoff differences (a transaction landing in the last hour of a month can fall into different periods depending on cutoff rules), deduplication differences (one system may double-count a refunded-and-rebooked transaction), and filter differences (one may exclude a category like taxes, refunds, or a specific business line the other includes). Building a row-level reconciliation, matching individual transactions between the two sources and bucketing the unmatched ones by REASON, turns a vague 'the numbers don't match' into a quantified, explainable gap: 'X% of the gap is timing, Y% is a known exclusion, Z% is currently unexplained and needs further digging.'
For a finance or executive audience specifically, the presentation matters as much as the analysis: lead with the size and DIRECTION of the gap, then the reconciled breakdown by known cause, then the remaining unexplained residual (never omit it or round it away), and close with a concrete next step and owner, not just a description of the mismatch.
Worked example. Warehouse-computed monthly revenue is 3% higher than the finance ledger for Q4. Row-level matching on transaction ID finds: 1.1 percentage points is late-arriving data that hadn't hit the ledger yet at close (a timing difference, both numbers will agree once the ledger catches up), 1.4 percentage points is a set of refunded transactions the warehouse hadn't yet marked as reversed, and 0.5 percentage points remains unmatched and needs a deeper look at currency-conversion timing for international transactions. Presenting that breakdown, rather than a single unexplained '3% off,' lets Finance immediately see that most of the gap has a known, benign explanation and only a small residual needs continued investigation.
Trade-offs and pitfalls. Never present a reconciliation as fully resolved if a residual remains, even a small one, at finance stakes; an unexplained residual that later turns out to be a real bug, after being implicitly waved away, does far more damage to trust than disclosing it upfront. Row-level matching is more expensive than aggregate comparison, but for a discrepancy this consequential the cost is justified, since aggregate comparison alone can't distinguish 'lots of small timing differences netting out' from 'one systematic bug.'
Event counts in a downstream analytics table suddenly doubled overnight. Walk through how you would debug the pipeline to find the source of duplication: what intermediate checks you'd run in staging versus production, which metadata or job-version checks you'd inspect, and how you would isolate whether duplication is occurring at ingestion, transformation, or load.
Sample Answer
Direct answer. When event counts in a downstream table suddenly double, the fastest way to localize the bug is to check the SAME data at each stage of the pipeline (staging versus production, before versus after each transformation) to find the exact stage where the count doubles, rather than guessing at the cause from the final table alone.
Structured elaboration. Start at the earliest available checkpoint (raw ingestion) and work forward: if the raw ingested event count is normal but a staging table downstream of the first transformation already shows double, the bug lives in that specific transformation step (commonly a join that's fanning out rows because of an unexpectedly non-unique join key, or a retry mechanism re-processing the same batch). If ingestion itself is already double, the bug is upstream, likely a client or server retry sending the same event twice, or a message-queue redelivery without idempotency. Metadata and version checks help narrow the window: check the job-run history for the transformation pipeline for a recent code deploy or configuration change, and check whether the doubling started exactly at a specific run ID or timestamp, which usually pins down the responsible deploy precisely.
Worked example. A downstream analytics table's event count doubles overnight. Checking the immediately-upstream staging table shows it's still at the normal count, isolating the bug to the transformation JOB that populates the downstream table specifically. Checking that job's recent deploy history shows a change shipped the same day that altered a join condition; the new join key wasn't unique per event, causing each event to fan out against two matching rows in a lookup table instead of one, exactly doubling the output. Reverting that specific join-condition change (not the whole deploy) restores normal counts.
Trade-offs and pitfalls. The value of checking staging versus production data specifically, rather than only comparing final output to a prior day's final output, is that it converts 'the number is wrong' into 'the number becomes wrong at THIS specific stage,' which is a vastly smaller, faster search than debugging an entire multi-stage pipeline from the final output backward with no isolation.
A dashboard shows an anomaly, but nothing is actually wrong with the underlying business. List the non-behavioral reasons a dashboard commonly produces a false-positive anomaly, and for each, give a quick check you would run to confirm or rule it out.
Sample Answer
Direct answer. A dashboard can show a real-looking anomaly even when nothing about the underlying business changed at all, because of purely mechanical, non-behavioral causes: reporting delays, timezone misalignment, a schema change, or a shift in sampling. Ruling these out is cheap and should happen before any product hypothesis is entertained.
Structured elaboration. Reporting delay: the most recent day or hour of data is often still partially arrived when a dashboard is viewed, so 'today' always looks artificially low until the day fully closes out; check by comparing the affected period's data completeness against how a fully-settled period usually looks at the same relative time. Timezone misalignment: if the underlying data is stored in UTC but a dashboard aggregates 'daily' using a different timezone (or vice versa), a day's boundary can silently include or exclude a few hours of real activity, especially visible as a systematic day-of-week or region-specific pattern; check by confirming the timezone used in the aggregation matches what's assumed downstream. Schema changes: a column rename, type change, or new required field can silently break a query without erroring, producing partial or zero results for affected rows; check by diffing the table schema against the prior day. Sampling changes: a shift in what fraction of events are captured or forwarded (a sampling-rate change, a new filter rule) changes the reported volume without any real change in underlying activity; check by looking at the ratio between two events that should move in lockstep (a raw request count and a downstream logged-event count).
Worked example. A daily signup count looks 15% below its usual level when checked at 9am. Comparing against how the SAME metric typically looks at 9am on a normal day (partial-day data, not yet complete) versus its final end-of-day value shows this is simply reporting delay: the day isn't over yet in the source timezone, and the number will converge to a normal range by end of day, no real anomaly exists.
Trade-offs and pitfalls. These four causes should be the FIRST things checked, in roughly this order (delay and timezone are the cheapest and most common), specifically because they're each fast, mechanical checks that either confirm or rule out an entire category of false alarm before any time is spent on a product investigation; skipping straight to product hypotheses when one of these four is actually the cause is the single most wasteful and most common mistake in this kind of work.
Unlock Full Question Bank
Get access to all 9 Data Investigation and Root Cause Analysis interview questions and detailed answers.
Sign in to ContinueJoin thousands of developers preparing for their dream job.