← Waymo Interview Insights

Waymo·Data Scientist·Technical Phone Screen·Senior

SeniorPrefer not to say
Jun 2026

Summary

Waymo data scientist interview, SQL-heavy technical screen with four progressively harder questions all built around the same ride-hailing schema. The last two questions were genuinely tricky and I don't think I fully nailed either of them.

Questions Asked (4)

Q1

Given a users table and a rides table for a ride-hailing product, count the number of users who took zero rides during a specific 7-day window (July 1 through July 7, 2024, inclusive).

Product Analytics & MetricsData Modeling
Author's notes

Pretty straightforward once you remember to left join from users and filter on the ride side for nulls.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Clarify the definition of 'took zero rides' and the grain of the users table, then use a LEFT JOIN or NOT EXISTS to identify users with no rides in the specified window. Count distinct users who have no matching ride records between July 1 and July 7, 2024.

Pro tip: Explicitly state your assumptions about the users table (e.g., whether it includes all registered users or only active users) and whether the window is based on ride request time or completion time, as these details significantly impact the result.

1. Clarify requirements and assumptions

Confirm the definition of 'zero rides' (e.g., no rides requested or completed), the time window boundaries (inclusive), and the grain of the users table (e.g., one row per user).

2. Identify relevant tables and keys

Determine the join key between users and rides (likely user_id) and ensure the rides table has a timestamp column to filter by the 7-day window.

3. Filter rides within the window

Create a subset of rides that occurred between July 1 and July 7, 2024, inclusive, using appropriate date functions.

4. Find users with no rides in the window

Use a LEFT JOIN from users to the filtered rides and filter for NULL ride IDs, or use NOT EXISTS / NOT IN to exclude users who have rides in the window.

5. Count distinct users

Count the number of distinct user IDs that satisfy the condition, ensuring no duplicates if the users table has multiple rows per user.

Key Points to Mention

  • Definition of 'zero rides': whether it means no ride requests, no completed rides, or no rides at all in the window.
  • Time window inclusivity: July 1 through July 7, 2024, inclusive, and timezone considerations.
  • Join type: LEFT JOIN or NOT EXISTS to find users without rides, avoiding incorrect results from INNER JOIN.
  • Handling NULLs: ensuring that users with no rides are correctly identified when using LEFT JOIN.
  • Grain of users table: whether it's one row per user or has duplicates, requiring DISTINCT count.
  • Edge cases: users who signed up after the window, users who took rides outside the window, and data quality issues.

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

Q2

For each calendar month that had at least one ride, compute the total number of rides and the average ride rating rounded to two decimal places. Return results sorted by month descending.

Product Analytics & Metrics
Author's notes

Mostly mechanical.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the schema and definitions (e.g., ride rating field, month extraction, handling NULLs). Then write a SQL query that groups rides by calendar month, filters out months with zero rides, computes COUNT(*) and AVG(rating) rounded to two decimals, and orders by month descending. Validate edge cases like NULL ratings and timezone effects.

Pro tip: Mention that you would check for NULL ratings and decide whether to exclude them from the average or treat them as zero—this shows attention to data quality and business impact. Also, confirm whether 'month' should be based on ride start time or end time, as this can affect the grouping.

1. Clarify requirements and data schema

Ask about the table structure, column names (e.g., ride_id, rating, ride_date), and definitions (e.g., what constitutes a 'ride', how to handle NULL ratings). Confirm the expected output format and sorting order.

2. Extract month and filter rides

Use date functions to extract the calendar month (e.g., DATE_TRUNC('month', ride_date) or EXTRACT(YEAR FROM ...) and EXTRACT(MONTH FROM ...)). Ensure you only consider months with at least one ride, which is naturally handled by GROUP BY.

3. Aggregate rides and ratings

Apply COUNT(*) for total rides and AVG(rating) for average rating. Use ROUND(AVG(rating), 2) to round to two decimal places. Consider whether to use COUNT(rating) if excluding NULLs.

4. Sort and present results

Order the results by month in descending order (e.g., ORDER BY month DESC). Ensure the month is displayed in a clear format (e.g., 'YYYY-MM').

5. Validate and discuss edge cases

Check for NULL ratings, timezone conversions, and months with no rides (which should be excluded). Discuss how you would validate the query against a sample dataset.

Key Points to Mention

  • Use of GROUP BY on the extracted month to aggregate rides.
  • Handling NULL ratings: decide whether to exclude them from AVG or treat them as zero, and document the choice.
  • Rounding average rating to two decimal places using ROUND(AVG(rating), 2).
  • Sorting by month descending, ensuring the month is in a sortable format (e.g., date or 'YYYY-MM').
  • Filtering out months with zero rides is implicit via GROUP BY, but mention it explicitly.
  • Consideration of timezone or date truncation to define calendar month consistently.

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

Q3

Count the number of distinct users who have taken 0 or 1 total rides across their entire lifetime, grouped by city. Users who never took a ride must be included in the count.

Product Analytics & MetricsData Modeling
Author's notes

Similar left join pattern as question one but now you're grouping by city from the users table.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the data model: identify the user table (with city) and ride table (with user_id and ride timestamp). Use a LEFT JOIN from users to rides to include users with zero rides, then aggregate rides per user and filter for counts of 0 or 1, finally grouping by city and counting distinct users. Alternatively, use a subquery to pre-aggregate ride counts per user before joining to users.

Pro tip: Explicitly state that you're using a LEFT JOIN to preserve users with no rides, and mention that COUNT(DISTINCT user_id) is necessary because a user might appear multiple times if the join is not properly aggregated. This shows attention to data integrity and edge cases.

1. Clarify the data model and assumptions

Identify the relevant tables (e.g., users, rides) and their join keys. Confirm that each user has a city attribute and that rides are linked to users via user_id.

2. Aggregate ride counts per user

Use a subquery or CTE to count the total number of rides per user, ensuring that users with zero rides are represented (e.g., by left joining users to rides and counting rides).

3. Filter for users with 0 or 1 rides

Apply a filter to keep only users whose ride count is 0 or 1.

4. Group by city and count distinct users

Group the filtered results by city and count the distinct user_ids to get the final metric.

5. Validate and consider edge cases

Check for potential issues like users with multiple cities, null values, or duplicate ride records, and discuss how to handle them.

Key Points to Mention

  • Use of LEFT JOIN to include users with zero rides
  • Aggregation of ride counts per user before filtering
  • COUNT(DISTINCT user_id) to avoid double-counting
  • Handling of users with no rides (e.g., COALESCE to treat null as 0)
  • Grouping by city and ensuring city is from the user table, not ride table
  • Performance considerations: pre-aggregating rides before joining to avoid large intermediate results

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

Q4

For each user, rank the calendar months in which they had at least one ride chronologically (skipping months with no rides). Then compute the average ride rating across all rides that occurred in users' 1st and 3rd active months, grouped by city.

Product Analytics & MetricsData ModelingAlgorithms & Data Structures
Author's notes

This one took me a minute to even parse.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Break the problem into two stages: first, for each user, identify their active months and rank them chronologically using a window function like DENSE_RANK or ROW_NUMBER. Then, filter to rides in the 1st and 3rd active months, join with city information, and compute the average rating grouped by city.

Pro tip: Clarify how to handle ties or missing months—e.g., if a user has rides in January, March, and April, their active months are Jan (1st), Mar (2nd), Apr (3rd). Also, confirm whether 'rating' is per ride or per user; assume per ride unless specified.

1. Identify active months per user

Extract distinct year-month combinations from the rides table for each user, ensuring you capture only months where they had at least one ride.

2. Rank active months chronologically

Use a window function (e.g., DENSE_RANK() OVER (PARTITION BY user_id ORDER BY year_month)) to assign a rank to each active month, skipping gaps.

3. Filter to 1st and 3rd active months

Select rides that occurred in months where the rank is 1 or 3 for each user.

4. Join with city and compute average rating

Join the filtered rides with city information (if not already present) and calculate the average ride rating grouped by city.

Key Points to Mention

  • Use of window functions (DENSE_RANK or ROW_NUMBER) to rank months per user.
  • Handling of gaps: months with no rides are skipped, so ranking is based on active months only.
  • Filtering condition: rank IN (1,3) to capture 1st and 3rd active months.
  • Grouping by city after joining ride data with city attributes.
  • Assumption about rating: average of individual ride ratings, not user-level averages.
  • Edge cases: users with fewer than 3 active months should be excluded from the 3rd month calculation.

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