Data Quality and Anomaly Detection Questions
Focuses on identifying, diagnosing, and preventing data issues that produce misleading or incorrect metrics. Topics include spotting duplicates, missing values, schema drift, logical inconsistencies, extreme outliers caused by instrumentation bugs, data latency and pipeline failures, and reconciliation differences between sources. Covers validation strategies such as data tests, checksums, row counts, data contracts, invariants, and automated alerting for quality metrics like completeness, accuracy, and timeliness. Also addresses investigation workflows to determine whether anomalies are data problems versus true business signals, documenting remediation steps, and collaborating with engineering and product teams to fix upstream causes.
Sample Answer
Sample Answer
SELECT event_date, COUNT(DISTINCT user_id) as wau
FROM events
WHERE event_date BETWEEN '2025-11-20' AND '2025-12-04'
GROUP BY event_date
ORDER BY event_date;SELECT 'raw' as src, COUNT(*) FROM raw_events WHERE event_date = '2025-12-01'
UNION ALL
SELECT 'proc', COUNT(*) FROM events WHERE event_date = '2025-12-01';Sample Answer
from great_expectations.profile.basic_dataset_profiler import BasicDatasetProfiler
import great_expectations as ge
df = ge.from_pandas(sample_df)
suite = ge.dataset.Dataset.expect_column_values_to_not_be_null("user_id")
suite += df.expect_column_values_to_be_between("age", min_value=0, max_value=120)Sample Answer
Sample Answer
-- events vs. users created
SELECT date(created_at) AS d,
COUNT(*) FILTER (WHERE event_name='signup') AS signup_events,
COUNT(DISTINCT user_id) FILTER (WHERE event_name='signup') AS signup_event_users,
COUNT(*) FILTER (WHERE event_type='user_create') AS users_created
FROM events
WHERE date(created_at) BETWEEN '2025-11-01' AND '2025-11-10'
GROUP BY d
ORDER BY d;SELECT source, medium, campaign, COUNT(*) AS signups
FROM events
WHERE event_name='signup' AND date(created_at)='2025-12-01'
GROUP BY 1,2,3
ORDER BY signups DESC LIMIT 50;SELECT user_id, COUNT(*) AS cnt, MIN(created_at), MAX(created_at)
FROM events
WHERE event_name='signup' AND date(created_at)='2025-12-01'
GROUP BY user_id
HAVING COUNT(*) > 1
ORDER BY cnt DESC LIMIT 100;-- 24h activation rate for Monday signups
WITH monday AS (
SELECT user_id FROM users WHERE date(created_at)='2025-12-01'
)
SELECT COUNT(*) FILTER (WHERE a.event_count>0)::float / COUNT(*) AS activation_rate
FROM monday m
LEFT JOIN (
SELECT user_id, COUNT(*) AS event_count
FROM events
WHERE event_name IN ('activate','first_action') AND created_at <= (SELECT MIN(created_at) + interval '24 hours' FROM users WHERE date(created_at)='2025-12-01')
GROUP BY user_id
) a ON m.user_id=a.user_id;SELECT ip, COUNT(*) AS signups, ARRAY_AGG(DISTINCT user_agent) AS uas
FROM events
WHERE event_name='signup' AND date(created_at)='2025-12-01'
GROUP BY ip
HAVING COUNT(*) > 10
ORDER BY signups DESC;Unlock Full Question Bank
Get access to hundreds of Data Quality and Anomaly Detection interview questions and detailed answers.
Sign in to ContinueJoin thousands of developers preparing for their dream job.