← Disney Interview Insights

Disney·Data Scientist·Take-home Assignment·Senior

Senior
Jul 2026

Summary

Disney/Hulu data science take-home that was basically a gauntlet of SQL funnel questions on a streaming product schema. Five sub-parts, each harder than the last, and the bonus rolling-window question nearly broke me. Felt more like an engineering screen than a DS interview.

Questions Asked (5)

Q1

Build a daily impression-to-click-to-signup-to-subscription funnel for each day in a date range, with time-bounded attribution windows at each stage (click within 1 day of impression, signup within 3 days of click, subscription within 7 days of signup). Output daily counts and stage-to-stage conversion rates.

Product Analytics & MetricsData Modeling
Author's notes

This one took me longer than it should have.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the data model and attribution logic, then outline a SQL-based solution using window functions and joins to enforce the time-bounded windows. Finally, compute daily counts and conversion rates, and discuss how to handle edge cases like multiple touches and late-arriving data.

Pro tip: Mention that you would validate the funnel by checking for negative or >100% conversion rates, which can occur if attribution windows overlap or if users have multiple events. Also, consider using a user-level deduplication strategy to avoid double-counting.

1. Clarify requirements and data model

Ask about the event tables (impressions, clicks, signups, subscriptions) and their schemas, including timestamps and user IDs. Confirm the attribution windows and whether they are inclusive or exclusive.

2. Define attribution logic

For each stage, determine how to link events within the time window. For example, a click is attributed to an impression if it occurs within 1 day after the impression and belongs to the same user.

3. Write SQL with window functions and joins

Use self-joins or window functions to find the first qualifying event at each stage. For instance, for each impression, find the earliest click within 1 day; then for each click, find the earliest signup within 3 days, etc.

4. Aggregate daily counts and compute conversion rates

Group by date (based on the impression date) and count distinct users or events at each stage. Compute conversion rates as the ratio of counts between consecutive stages.

5. Handle edge cases and validate

Address multiple touches (e.g., use first-touch or last-touch attribution), late-arriving data, and timezone considerations. Validate results by checking for anomalies like conversion rates exceeding 100%.

Key Points to Mention

  • Use of window functions (e.g., ROW_NUMBER, LEAD) to find the next event within the time window.
  • Importance of user-level deduplication to avoid double-counting users across multiple impressions or clicks.
  • Handling of multiple attribution paths (e.g., a user may have multiple impressions before a click) and choosing an attribution model (first-touch, last-touch, etc.).
  • Timezone alignment and date truncation to ensure daily buckets are consistent.
  • Performance considerations for large datasets, such as indexing on user_id and timestamp, and using efficient joins.
  • Validation checks: ensure conversion rates are between 0 and 100%, and compare with overall funnel metrics.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q2

For users who signed up in August 2025, compute the median time in minutes from signup to first watch_start, broken out by signup date and acquisition channel (organic vs. paid based on whether campaign_id is null).

Product Analytics & MetricsA/B Testing & Experimentation
Author's notes

Median in SQL always makes me pause because you can't just AVG().

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the schema and defining the cohort: users who signed up in August 2025, with signup date and acquisition channel derived from campaign_id. Then write a SQL query that joins signups to the first watch_start event per user, computes the time difference in minutes, and uses a window function or percentile_cont to get the median per signup date and channel. Finally, validate the results and discuss any data quality or interpretation caveats.

Pro tip: Mention that you would check for users with no watch_start events and decide whether to exclude them or treat their time as infinite, as this can significantly affect the median. Also, note that using the first watch_start per user avoids double-counting and ensures the metric reflects initial engagement.

1. Clarify requirements and data model

Confirm the definition of 'first watch_start' (earliest event per user), the signup date range (August 1-31, 2025), and how to classify acquisition channel (paid if campaign_id is not null, organic otherwise). Identify the relevant tables and join keys.

2. Build the cohort and compute time to first watch

Filter users who signed up in August 2025, join to their first watch_start event, and calculate the time difference in minutes between signup and first watch_start. Ensure you handle users with no watch_start appropriately.

3. Calculate median by signup date and channel

Group by signup date and acquisition channel, then compute the median time using a percentile function (e.g., PERCENTILE_CONT(0.5) in SQL) or a window function. Be mindful of small sample sizes per group.

4. Validate and interpret results

Check for outliers, missing data, and whether the median is stable across groups. Consider if the metric aligns with business expectations and discuss any limitations, such as censoring for users who haven't watched yet.

Key Points to Mention

  • Use of SQL window functions (e.g., ROW_NUMBER) to get the first watch_start per user.
  • Definition of acquisition channel: paid if campaign_id is not null, organic if null.
  • Handling of users with no watch_start events (exclude vs. impute vs. treat as infinite).
  • Median calculation using PERCENTILE_CONT or equivalent, and why median is preferred over mean for skewed time-to-event data.
  • Potential data quality issues: timezone consistency, duplicate events, and signup date definition.
  • Segmentation by signup date to observe trends over the month and by channel to compare organic vs. paid performance.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q3

Identify suspicious ad campaigns in the last 7 days where the click-through rate exceeds 80%, there are at least 100 impressions, and the number of distinct users is 5 or fewer. Return campaign details including CTR and distinct user count.

Product Analytics & MetricsRoot Cause Analysis
Author's notes

This is basically a fraud detection filter.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the schema and definitions (e.g., how CTR and distinct users are calculated, time zone for 'last 7 days'). Then outline a SQL query that filters campaigns by date, impressions >= 100, CTR > 80%, and distinct users <= 5, and returns the required fields. Finally, discuss how to validate results and interpret them in a fraud detection context.

Pro tip: Mention that you would also check for other anomalies like unusually high impression-to-click ratios or suspicious user agents to strengthen the fraud detection, showing you think beyond the immediate query.

1. Clarify Requirements and Data Schema

Confirm the definitions of CTR, distinct users, and the time window (e.g., last 7 days from today, using which time zone). Identify the relevant tables and columns (e.g., ad_events, campaigns).

2. Design the SQL Query

Write a query that filters events from the last 7 days, aggregates by campaign, calculates CTR and distinct users, and applies the conditions: CTR > 80%, impressions >= 100, distinct_users <= 5.

3. Validate and Interpret Results

Check for edge cases (e.g., division by zero, NULLs) and consider if the thresholds are appropriate. Interpret the findings: these campaigns likely indicate click fraud or bot activity.

4. Communicate Findings and Next Steps

Present the suspicious campaigns with metrics, and suggest further investigation (e.g., analyzing user behavior, IP addresses) and potential actions (e.g., pausing campaigns).

Key Points to Mention

  • Use of SQL aggregation functions (COUNT, COUNT DISTINCT, SUM) and proper date filtering (e.g., DATE_SUB or BETWEEN).
  • Definition of CTR: clicks / impressions * 100, and handling of division by zero.
  • Importance of distinct user count as a fraud indicator (low distinct users with high clicks).
  • Consideration of time zone and data freshness for 'last 7 days'.
  • Potential need to join multiple tables (e.g., campaigns and events) to get campaign details.
  • Interpretation: such campaigns are likely fraudulent or bot-driven, and may require further investigation.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q4

Deduplicate events by collapsing identical (user_id, event_type, show_id) combinations that occur within a 5-second window, keeping only the earliest timestamp. Produce a clean deduplicated events CTE.

Data ModelingAlgorithms & Data Structures
Author's notes

LAG() with a partition and a timestamp diff check.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Use a window function to compare each event's timestamp with the previous event's timestamp for the same (user_id, event_type, show_id) combination. Flag events that are more than 5 seconds after the previous event (or are the first event) as the start of a new deduplication group, then select only those flagged events. This yields the earliest timestamp in each 5-second window.

Pro tip: Explicitly state your assumption about the 5-second window: whether it's relative to the previous event (gap-based) or a fixed tumbling window. In most deduplication contexts, a gap-based approach is expected, but clarifying shows you understand the nuance and avoids ambiguity.

1. Partition and order events

Use a window function to partition by (user_id, event_type, show_id) and order by timestamp ascending. This groups related events and establishes chronological order.

2. Compute time difference

Calculate the difference between the current event's timestamp and the previous event's timestamp within each partition, using LAG or a similar function.

3. Flag window starts

Mark an event as a 'keeper' if it is the first event in the partition (previous timestamp is NULL) or if the time difference exceeds 5 seconds. This identifies the earliest event in each 5-second window.

4. Filter to keep only flagged events

Select only the rows where the flag is true, producing the deduplicated events with the earliest timestamp per window.

5. Wrap in a CTE

Encapsulate the logic in a common table expression (CTE) named deduplicated_events for clarity and reusability.

Key Points to Mention

  • Use of window functions (PARTITION BY, ORDER BY) to group and order events.
  • LAG function to access the previous event's timestamp within each partition.
  • Definition of the 5-second window: gap-based (relative to previous event) vs. fixed tumbling window.
  • Handling of the first event in each partition (no previous timestamp).
  • Filtering logic to retain only the earliest event in each window.
  • Performance considerations: indexing on (user_id, event_type, show_id, timestamp) and potential use of QUALIFY in some SQL dialects.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q5

Compute a 28-day rolling count of unique viewers per show using watch_start events, for each day across August and September 2025. Return the top 3 shows by this rolling metric on a specific target date, breaking ties by most recent daily unique viewers.

Product Analytics & MetricsData ModelingTechnical Trade-offs
Author's notes

The bonus question and it genuinely stumped me for a bit.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the data model and definitions: watch_start events, unique viewers, and the 28-day rolling window. Then outline a SQL-based solution using window functions to compute daily unique viewers per show, followed by a rolling sum over the 28-day window. Finally, rank shows on the target date and apply tie-breaking logic.

Pro tip: Mention that you would validate the rolling window logic with a small test case and consider performance implications of large datasets, such as using partitioning and indexing. Also, proactively discuss how to handle edge cases like shows with no views on certain days.

1. Clarify requirements and definitions

Confirm what constitutes a unique viewer (e.g., distinct user_id per day per show) and the exact rolling window (28 days including current day). Also clarify the target date and tie-breaking rule.

2. Compute daily unique viewers per show

Write a query to aggregate watch_start events by date and show, counting distinct viewers. Ensure date range covers August and September 2025, plus 27 days prior for the rolling window.

3. Calculate 28-day rolling unique viewers

Use a window function to sum daily unique viewers over the preceding 28 days for each show. Be careful to avoid double-counting viewers across days if the metric is truly unique over the window.

4. Rank shows on target date and apply tie-breaking

Filter to the target date, rank shows by rolling metric descending, and break ties by daily unique viewers descending. Return top 3.

5. Validate and discuss trade-offs

Test with sample data, consider performance optimizations, and discuss alternative approaches (e.g., approximate distinct counts) if scale is an issue.

Key Points to Mention

  • Definition of unique viewers: distinct user_id per show per day
  • Rolling window: 28 days including current day, using window functions like SUM() OVER (ORDER BY date ROWS BETWEEN 27 PRECEDING AND CURRENT ROW)
  • Handling of missing dates: ensure all dates are present or use a date spine to avoid gaps
  • Tie-breaking: order by rolling metric DESC, then daily unique viewers DESC
  • Performance considerations: partitioning by show, indexing on date and show, and potential use of approximate algorithms for distinct counts at scale
  • Validation: test with a small dataset and compare against manual calculation

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.