N045-M4 Tier 4 · Advanced · medium ecommerce · Brightlane

Return every delivered order's ID, customer ID, total amount, and the order's quintile across delivered orders. Sort the final result by `total_amount` descending

Part of NTILE and Percentile Functions in SQL

The problem

Brightlane's customer success team is prioritizing follow-up on completed orders by value, segmented into five value quintiles.

Write a query to return every delivered order's ID, customer ID, total amount, and the order's quintile across delivered orders. Sort the final result by total_amount descending.

Assumptions:

  • A delivered order has status = 'delivered'. Only delivered orders should appear in the result and contribute to the quintile bucketing.
  • Delivered orders are sorted by total_amount descending and assigned to one of five quintiles based on position. Quintile 1 covers the highest-value fifth of delivered orders by row count; quintile 5 covers the lowest-value fifth.
  • When the row count does not divide evenly by 5, the earlier quintiles each receive one extra record.
  • The final result is sorted by total_amount descending.

Output:

  • One row per delivered order, with columns id, customer_id, total_amount, and spend_quintile. Sorted by total_amount descending.
Schema · ecommerce 5 tables
categories
id integer
name text
parent_id? integer
products
id integer
name text
category_id integer
price numeric
stock_qty integer
attributes? jsonb
order_items
id integer
order_id integer
product_id integer
quantity integer
unit_price numeric
customers
id integer
name text
email text
city? text
country text
created_at timestamptz
is_active boolean
orders
id integer
customer_id integer
ordered_at timestamptz
status text
total_amount numeric

Run previews · Check grades

Write a query, then run it to see results here.

Worked solution Try it yourself first
Solution query
SELECT
  id,
  customer_id,
  total_amount,
  NTILE(5) OVER (
    ORDER BY
      total_amount DESC
  ) AS spend_quintile
FROM
  orders
WHERE
  status = 'delivered'
ORDER BY
  total_amount DESC

The shape

Filter to delivered orders first, then run NTILE(5) over a descending total_amount sort so quintile 1 is the highest-value fifth. Sorting descending inside the window is what makes the quintile numbers ascend in the direction the customer success team wants: tier 1 is "follow up first," tier 5 is "lowest priority."

Clause by clause

  • SELECT id, customer_id, total_amount, NTILE(5) OVER (ORDER BY total_amount DESC) AS spend_quintile returns the order's identifying columns and its quintile. ORDER BY total_amount DESC inside OVER is what flips the bucket numbering: the largest order is row 1 in the sort, lands in bucket 1, and tier 1 ends up meaning "highest value."
  • FROM orders is the row source.
  • WHERE status = 'delivered' keeps only delivered orders. The filter runs before the window function, so NTILE only ever sees delivered orders and the quintile split is computed across that population alone.
  • ORDER BY total_amount DESC is the outer sort. It prints the result with the highest-value delivered orders at the top, which is also where quintile 1 sits.

Why the filter goes in WHERE and not on the window

The customer success team only cares about delivered orders. They should not contribute to the quintile bucketing either: a quintile cut that included pending and cancelled orders would shift the boundaries away from "the top fifth of delivered orders." WHERE filters before the window function runs, which is the right execution order for this requirement.

The trap

The descending sort inside OVER is what aligns quintile 1 with the highest-value fifth. Writing ORDER BY total_amount (ascending) instead would flip the meaning: tier 1 would become the lowest-value fifth and the customer success team's follow-up list would target the wrong orders. The outer ORDER BY total_amount DESC only controls the printed sequence; the window's sort is what controls the bucket assignment. Both sorts have to agree in direction for the result to read cleanly.

You practiced NTILE(5) OVER (ORDER BY ... DESC) — descending ordering reverses the bucket-to-value mapping; bucket 1 becomes the top values rather than the bottom.

How you actually get good at SQL

Reading explains SQL. Writing it, over and over with instant feedback, is what makes you fluent.

That's the whole SQLMaxx loop: 600+ real problems, instant AI feedback, mastery you can actually see, and spaced review that won't let you forget.

A stack of SQL practice problem cards, the top card showing an employees table.
615 problems · 66 concepts

Real problems. Not toy examples.

615 hand-built problems spanning all 66 concepts, from basic SELECTs to window functions, built on real schemas and real business questions, the kind you'll actually get asked on the job. Enough reps to make SQL automatic.

A retro computer showing a SQL query marked correct with a green checkmark.
Instant AI feedback

Write a query. Know if it's right in one second.

No copying an answer and hoping it clicked. The AI grader checks your real query against real data, catches exactly what's wrong, and explains the fix in plain English, like a senior analyst reading over your shoulder on every problem.

A circular mastery progress dial filling from blue to green, the SQLMaxx diamond at its center.
Mastery tracking

Stop guessing whether you actually know it.

SQLMaxx tracks every concept and shows you what you've mastered and what's still shaky. Your skills fill in one concept at a time, so 'I think I get joins' becomes something you can prove.

A SQL query editor circled by a blue return arrow with a clock, scheduled to come back for review.
Spaced review

Learn it once. Keep it for good.

Most of what you learn this week fades by next week. So when a concept comes due for review, SQLMaxx hands you a fresh problem to solve from a blank editor, not a flashcard to re-read. A research-backed spaced-repetition algorithm (FSRS) times each return for right before you'd forget, so your SQL is still there months later, when the interview or the job actually needs it.

Practice, feedback, mastery, review. That's the loop that turns reading into real skill.

Start free

No account, no credit card. Start solving in under a minute.