Skip to main content

12 DoorDash SQL Interview Questions From 2025 and 2026 Candidates

Data Science
Aced TeamAced Team • Published

Every question on this page comes from a candidate's own account of a DoorDash interview, reported in 2025 or 2026. Aced members have written up seven DoorDash interviews that involved SQL, six for data scientist roles and one for a data engineer role. In November 2026 we also read more than 30 first-person reports posted since January 2025 on Glassdoor, Blind, 1point3acres, and LeetCode Discuss.

Each question says where the report came from and when. Table and column names are as the candidates remembered them. Where a candidate gave no schema, we say so and supply one. The sample data and the answers are ours, and every query was run in PostgreSQL.

How DoorDash's SQL rounds work

Data scientist: 30 minutes of SQL, then a case

The first technical round is an hour: 30 minutes of SQL and 30 minutes on a product case. An Aced member who interviewed in 2025 described that split, and another in December 2025 listed a 30-minute SQL screen and a separate 30-minute case screen. Six Glassdoor reviews posted between November 2025 and November 2026 describe 30 minutes of SQL alongside a case. Two candidates said a recruiter questionnaire came before it.

  • Four questions in 30 minutes. Five Glassdoor reviews from August 2025 to August 2026 put the SQL part at four questions. One reviewer (July 2026) had almost no time for the last one and was told candidates are not expected to finish all four.
  • The hard question is a window function. Three Glassdoor reviews from 2026 name LAG, and one of them also names RANK. One described the hardest of the four as a metric compared with its value the month before.
  • Some sessions run on HackerRank, and at least one did not run code at all. A November 2025 reviewer had no way to execute code and was graded on logic. A 1point3acres poster in June 2026 said the interviewer was lenient about typos and syntax.
  • Expect little conversation. An August 2026 reviewer said the interviewer pasted a question, read the answer, and pasted the next one with little comment. An Aced member who interviewed in 2025 was told the interviewer cared about a correct answer, not narration.
  • The format may be changing. A Glassdoor reviewer who interviewed in September 2026 said the SQL part no longer asks you to write the query; the query is given to you. A 1point3acres poster in November 2026 described a new-format round where the interviewer showed a schema, asked what they would look at, and showed the code only in the last four minutes. A commenter on that post described the same round. These are a few reports from late 2026, so ask your recruiter which format you will get.

Candidates named these case topics: food arriving cold (an Aced member in 2025, and a 1point3acres poster in June 2026), delivery by bike (two data scientist reports in 2026), and diagnosing a drop in orders in one city (June 2026).

Data engineer: four SQL questions and one Python question

The technical screen is live coding with four SQL questions and one Python question. Four Glassdoor reviews between January 2025 and June 2026 describe that count. A candidate who posted on both Glassdoor and LeetCode Discuss in September 2025 gave the SQL mix as two easy, one medium, and one hard.

  • Check the dialect before you start. A January 2026 reviewer took the screen on HackerRank, graded by test cases, and found the SQL environment accepted only MySQL. Their PostgreSQL-syntax answer would not compile, and it cost them time.
  • An unconfirmed assumption cost one candidate a question. An Aced member who interviewed in April 2026 had at least three SQL questions, with the interviewer running the code as it was written. A disagreement over one assumption on the third question led to a wrong answer.
  • Three out of four may not be enough. The January 2026 reviewer solved three SQL questions and the Python question and was still rejected.
  • Later rounds are modeling cases. Reviewers in 2025 and 2026 describe a data-modeling case for a fitness app, a dashboard case, and a question on handling late-arriving data.

Data scientist questions

1. Monthly share of high-frequency customers

Reported on 1point3acres: DoorDash data scientist SQL round on HackerRank, posted July 2026, login needed to read it.

Table delivery_order has order_dt, customer_id, restaurant_id, dasher_id, and delivery_id. Table sales has delivery_id and sales_amount. For each month, what share of customers are high-frequency, meaning they placed more than 30 orders?

SQL
WITH monthly AS ( SELECT DATE_TRUNC('month', order_dt) AS order_month, customer_id, COUNT(*) AS orders FROM delivery_order GROUP BY 1, 2 ) SELECT order_month, SUM(CASE WHEN orders > 30 THEN 1 ELSE 0 END) * 1.0 / COUNT(*) AS high_frequency_share FROM monthly GROUP BY order_month ORDER BY order_month;

Count orders per customer per month first, then take the share of those customers over the threshold. The denominator is customers who ordered that month, which is the only population this table can give you.

Ask whether "more than 30 orders" is per month or over the customer's lifetime. This query reads it as per month. In MySQL, replace DATE_TRUNC('month', order_dt) with DATE_FORMAT(order_dt, '%Y-%m-01').

2. Top-spending customer each month, excluding high-frequency customers

Reported on 1point3acres: DoorDash data scientist SQL round, July 2026 (same post).

On the same tables, find the customer with the highest transaction in each month, leaving out the high-frequency customers.

SQL
WITH monthly AS ( SELECT DATE_TRUNC('month', o.order_dt) AS order_month, o.customer_id, COUNT(*) AS orders, SUM(s.sales_amount) AS spend FROM delivery_order o JOIN sales s ON s.delivery_id = o.delivery_id GROUP BY 1, 2 ), ranked AS ( SELECT order_month, customer_id, spend, RANK() OVER (PARTITION BY order_month ORDER BY spend DESC) AS spend_rank FROM monthly WHERE orders <= 30 ) SELECT order_month, customer_id, spend FROM ranked WHERE spend_rank = 1 ORDER BY order_month;

The exclusion has to happen before the ranking. If you rank first and filter after, a month whose top spender is high-frequency returns no row.

"Highest transaction" could mean the largest monthly total or the largest single order. This query uses the monthly total. For the single-order reading, replace SUM with MAX. RANK returns every customer tied for first; use ROW_NUMBER if the interviewer wants exactly one.

3. Month-over-month sales ratio for each restaurant

Reported on 1point3acres and Glassdoor: DoorDash data scientist SQL round, July 2026 (same post). A Glassdoor reviewer who interviewed the same month described the hardest of four questions as a metric relative to the previous month.

Compute the month-over-month ratio of sales for each restaurant.

SQL
WITH monthly AS ( SELECT o.restaurant_id, DATE_TRUNC('month', o.order_dt) AS order_month, SUM(s.sales_amount) AS sales FROM delivery_order o JOIN sales s ON s.delivery_id = o.delivery_id GROUP BY 1, 2 ) SELECT restaurant_id, order_month, sales, sales * 1.0 / LAG(sales) OVER (PARTITION BY restaurant_id ORDER BY order_month) AS mom_ratio FROM monthly ORDER BY restaurant_id, order_month;

LAG reads the previous row in each restaurant's partition. The first month has no previous row, so its ratio is NULL, which is correct.

The previous row is not always the previous month. If a restaurant had no sales in February, March would be compared with January. Tell the interviewer, and offer to join against a calendar of months if they want gaps treated as zero.

The same post said one more question asked for take rate. The poster gave no detail.

4. Percentage of late orders

Reported on 1point3acres: DoorDash data scientist first round, posted April 2026, login needed. A second candidate in June 2026 said they got a late-order question in place of the usual restaurant set, and a commenter guessed it was this one. The first poster recalled an order table and a request table but not the columns, so the tables here are ours.

Assume orders (order_id, customer_id, ordered_at, delivered_at). What percentage of orders were late, where late means delivered more than X minutes after the order was placed? Use 45 minutes.

SQL
SELECT 100.0 * SUM(CASE WHEN delivered_at > ordered_at + INTERVAL '45 minutes' THEN 1 ELSE 0 END) / COUNT(*) AS pct_late FROM orders WHERE delivered_at IS NOT NULL;

Ask how to treat orders that were never delivered. This query leaves them out of both the numerator and the denominator. Counting them as late, or as not late, changes the answer.

5. Orders with at least X requests, and average requests per order

Reported on 1point3acres: DoorDash data scientist first round, April 2026 (same post). The poster did not say what a request is. From the third question in the set, it reads like an offer sent to a Dasher, and that is how we modeled it.

Assume requests (request_id, order_id, dasher_id, requested_at). What percentage of orders received at least X requests, and what is the average number of requests per order? Use X = 2.

SQL
WITH per_order AS ( SELECT o.order_id, COUNT(r.request_id) AS requests FROM orders o LEFT JOIN requests r ON r.order_id = o.order_id GROUP BY o.order_id ) SELECT 100.0 * SUM(CASE WHEN requests >= 2 THEN 1 ELSE 0 END) / COUNT(*) AS pct_orders_2_plus, AVG(requests) AS avg_requests_per_order FROM per_order;

Start from orders with a LEFT JOIN so that an order with no requests counts as zero. An inner join would drop it and push both numbers up. COUNT(r.request_id) counts only matched rows, which is why the zero comes out right.

The third question in the same set asked for the percentage of orders with at least one offer increase and the average percentage increase across all requests. It can be answered the same way, with one row per order first and then the two aggregates.

6. Share of orders that come from the top customers

Reported on Glassdoor: DoorDash data scientist technical interview, July 2025. The reviewer did not describe the tables.

Using delivery_order from above: what percentage of orders come from the top customers, and how often do those customers order?

SQL
WITH per_customer AS ( SELECT customer_id, COUNT(*) AS orders, NTILE(10) OVER (ORDER BY COUNT(*) DESC) AS decile FROM delivery_order GROUP BY customer_id ) SELECT 100.0 * SUM(CASE WHEN decile = 1 THEN orders ELSE 0 END) / SUM(orders) AS pct_orders_from_top, AVG(CASE WHEN decile = 1 THEN orders END) AS avg_orders_per_top_customer FROM per_customer;

The reviewer's wording was "the % of top customers in orders". We read it as the share of orders that come from top customers.

This query defines "top customers" as the top 10% of customers by order count, which NTILE(10) labels as decile 1. A fixed cutoff such as the top 100 customers, or ranking by spend, would be just as reasonable.

A window function can sit in the same SELECT as a GROUP BY because it runs after the grouping.

Data engineer questions

Questions 7 to 10 are one candidate's complete set: four SQL questions in 30 minutes, after 20 minutes of Python. The candidate said all four were variations on well-known problems, and found the screen much harder than expected.

7. Employees by tenure bucket

Reported on 1point3acres: DoorDash data engineer phone screen, posted June 2025, login needed. The first of four SQL questions.

Table employees has employee_id and hire_date. Compute each employee's tenure today in whole years, rounded down. Put each employee in a bucket (0-2, 3-5, 6-10, or 10+ years) and return the number of employees in each bucket.

SQL
WITH tenure AS ( SELECT employee_id, EXTRACT(YEAR FROM AGE(CURRENT_DATE, hire_date)) AS years FROM employees ) SELECT CASE WHEN years <= 2 THEN '0-2' WHEN years <= 5 THEN '3-5' WHEN years <= 10 THEN '6-10' ELSE '10+' END AS tenure_bucket, COUNT(*) AS employees FROM tenure GROUP BY 1 ORDER BY MIN(years);

Subtracting the hire year from the current year overstates tenure for anyone whose anniversary has not come yet this year. AGE returns completed years, months, and days, so extracting the year gives the rounded-down figure. In MySQL, use TIMESTAMPDIFF(YEAR, hire_date, CURDATE()).

The bucket labels as reported overlap at 10 years. Point it out and state where you put the boundary; here, exactly 10 years goes in 6-10.

8. Top customers by spend in each segment

Reported on 1point3acres: DoorDash data engineer phone screen, June 2025 (same post).

Table orders has order_id, customer_id, amount, order_date, and status. Table customers has customer_id and customer_segment. Using only completed orders placed in June 2023, compute each customer's total spend, rank customers within their segment, and return the top 3 per segment.

SQL
WITH spend AS ( SELECT customer_id, SUM(amount) AS total_spent FROM orders WHERE status = 'completed' AND order_date >= '2023-06-01' AND order_date < '2023-07-01' GROUP BY customer_id ), ranked AS ( SELECT c.customer_segment, s.customer_id, s.total_spent, ROW_NUMBER() OVER (PARTITION BY c.customer_segment ORDER BY s.total_spent DESC) AS rn FROM spend s JOIN customers c ON c.customer_id = s.customer_id ) SELECT customer_segment, customer_id, total_spent FROM ranked WHERE rn <= 3 ORDER BY customer_segment, total_spent DESC;

Filter and aggregate before joining, so the ranking works on one row per customer. The half-open date range (on or after June 1, before July 1) keeps working if order_date turns out to be a timestamp.

The post says the question specified ROW_NUMBER, which returns exactly three rows per segment and breaks ties arbitrarily. If ties should all be kept, use RANK or DENSE_RANK.

9. Mobile-only users as a share of active users

Reported on 1point3acres: DoorDash data engineer phone screen, June 2025 (same post).

Table devices has user_id, device_id, is_active, and device_type. An active user has at least one device with is_active = 1. A mobile-only user is an active user whose active devices are all mobile. Return mobile-only users as a percentage of active users, rounded to two decimals.

SQL
WITH active_users AS ( SELECT user_id, SUM(CASE WHEN device_type <> 'mobile' THEN 1 ELSE 0 END) AS non_mobile_devices FROM devices WHERE is_active = 1 GROUP BY user_id ) SELECT ROUND(100.0 * SUM(CASE WHEN non_mobile_devices = 0 THEN 1 ELSE 0 END) / COUNT(*), 2) AS pct_mobile_only FROM active_users;

"All of their active devices are mobile" is easier to test as "none of their active devices is something else". Filtering to active devices first means an inactive desktop does not disqualify a user, which is what the definition says.

On our sample data two of four active users are mobile-only. User 1 qualifies because their desktop is inactive.

10. Runs of consecutive ordering days

Reported on 1point3acres: DoorDash data engineer phone screen, June 2025 (same post). The last of the four.

Table orders has id and order_date. For each id, find each run of consecutive days with an order, and return id, segment_start, and segment_end.

SQL
WITH days AS ( SELECT DISTINCT id, order_date FROM orders ), grouped AS ( SELECT id, order_date, order_date - CAST(ROW_NUMBER() OVER (PARTITION BY id ORDER BY order_date) AS INT) AS run_key FROM days ) SELECT id, MIN(order_date) AS segment_start, MAX(order_date) AS segment_end FROM grouped GROUP BY id, run_key ORDER BY id, segment_start;

This is the gaps-and-islands pattern. Within a run of consecutive days, the date and the row number both go up by one, so the date minus the row number stays constant. That constant identifies the run.

Remove duplicate days first. Two orders on the same day would otherwise get two row numbers and split one run into two.

11. Dashers who had late deliveries

Reported on Glassdoor: DoorDash data engineer technical interview, posted June 2025: four SQL problems in 30 minutes, with the harder ones needing window functions. The reviewer did not describe the tables.

Assume deliveries (delivery_id, dasher_id, picked_up_at, promised_at, delivered_at). Find the Dashers who had late deliveries.

SQL
SELECT dasher_id, COUNT(*) AS late_deliveries FROM deliveries WHERE delivered_at > promised_at GROUP BY dasher_id ORDER BY late_deliveries DESC;

Ask whether "late" means later than the time promised to the customer, or longer than some number of minutes after pickup. The query also returns each Dasher's count of late deliveries.

Data analyst question

12. Dasher performance by location

Reported on Glassdoor: DoorDash data analyst technical round, posted January 2025. The reviewer was given three tables and did not list them.

Assume dashers (dasher_id, name, location_id), locations (location_id, city), and deliveries as above. Write a query that shows Dasher performance by location, then explain what the result tells you.

SQL
SELECT l.city, COUNT(DISTINCT d.dasher_id) AS dashers, COUNT(*) AS deliveries, ROUND(AVG(EXTRACT(EPOCH FROM (dl.delivered_at - dl.picked_up_at)) / 60), 1) AS avg_minutes, ROUND(100.0 * SUM(CASE WHEN dl.delivered_at <= dl.promised_at THEN 1 ELSE 0 END) / COUNT(*), 1) AS pct_on_time FROM deliveries dl JOIN dashers d ON d.dasher_id = dl.dasher_id JOIN locations l ON l.location_id = d.location_id GROUP BY l.city ORDER BY pct_on_time;

The query measures performance as speed and reliability. It reports average delivery minutes and the on-time rate for each city, with delivery volume next to them so that a city with five deliveries is not read the same way as one with five thousand.

For the second half of the question, say which city is slowest, whether volume explains it, and what you would check next.

What to practice

  • Window functions. Practice LAG for month-over-month, RANK and ROW_NUMBER for top N per group, and gaps and islands. The window functions lesson covers all three.
  • Monthly rollups. Half of the data scientist questions above start by grouping to one row per customer or restaurant per month. See dates and bucketing.
  • Timed sets. Time yourself on four questions in 30 minutes, in the order easy, easy, medium, hard. A July 2026 reviewer was told candidates are not expected to finish all four.
  • MySQL syntax. If you normally write PostgreSQL, know the MySQL versions of date truncation and date differences before a HackerRank screen.

Our SQL interview questions and answers post covers questions reported at other companies. You can practice in a live editor in the SQL question bank and the SQL interview course.

Frequently asked questions

How many SQL questions are in a DoorDash interview?

Candidates most often report four in 30 minutes for data scientists, and four plus one Python question for data engineers. Three reports give three SQL questions (an Aced member in April 2026 who had at least three, a Glassdoor reviewer in May 2025, and a Blind commenter in June 2026).

Which SQL dialect does DoorDash use?

One data engineer candidate in January 2026 reported a HackerRank environment that accepted only MySQL. Other reports do not name a dialect, and at least one data scientist session did not run code at all. Ask the recruiter, and be ready to write date functions in MySQL.

How hard is the DoorDash SQL round?

Data scientist candidates mostly describe easy to medium questions with one harder window-function question, and an Aced member who interviewed for that role in April 2026 said the same. Data engineer candidates describe a harder set of two easy questions, one medium, and one hard. Five reports mention running short of time. Four questions in 30 minutes leaves about seven minutes each.

Is DoorDash changing its SQL interview?

Two candidates in late 2026 described a data scientist round where the query was supplied or the discussion came before any code. Most 2026 reports still describe writing four queries.

Learn everything you need to ace your data science interviews.

Aced is the fastest-growing tech interview prep platform. Get free interview guides, insider tips, and courses.

Create your free account

Related Courses

Data Science Interview Prep Course

8 courses5,300 students

Land your dream data science role at Google, Amazon, Microsoft, Meta, Apple, and other top companies. Learn from mock interviews, frameworks, and advice from senior candidates. Practice statistics, experimentation, coding, SQL, machine learning, behavioral interviews, and more.

Python Coding Questions for Data Scientists

18 lessons1,000 students

Master Python coding interviews focused on data science by exploring advanced data manipulation with Pandas and conducting statistical analysis and experiments. Gain proficiency in handling and transforming datasets, performing thorough statistical tests, and designing experiments with Python. Perfect for those looking to excel in technical interviews that assess data handling and analytical skills.

Related Blog Posts

Data Science Interview Prep (2026 Guide)

A month ago  •  5 min read

Top AI/ML Companies Hiring Now

A month ago  •  3 min read
formerly Exponent

Get updates in your inbox with the latest tips, job listings, and more.

Follow Us

Products
Courses
Interview Questions
Interview Experiences
Popular articles
Guides
Coaching
For Partners
Company
Exponent Labs, LLC © 2026
Terms of Service | Privacy