N010-M4 Tier 1 · Foundations · medium analytics · Streamhub

Return each unique pairing of plan and country from the users table

Part of DISTINCT in SQL

The problem

Streamhub's marketing team is planning region-specific plan promotions and needs to know which subscription-plan and country combinations exist in the user base.

Write a query to return each unique pairing of plan and country from the users table.

Assumptions:

  • The users table contains every account on the Streamhub platform.
  • A pairing is unique only when both plan and country differ — two users who are both on the pro plan in the US collapse to one row.

Output:

  • One row per unique combination, with columns plan and country.
Schema · analytics 5 tables
users
id integer
name text
email text
country text
plan text
signed_up_at timestamptz
is_active boolean
conversions
id integer
user_id integer
converted_at timestamptz
plan text
amount numeric
sessions
id integer
user_id integer
started_at timestamptz
ended_at? timestamptz
event_count integer
events
id integer
user_id integer
session_id? integer
event_type text
occurred_at timestamptz
properties? jsonb
periods
id integer
name text
start_month integer
end_month integer

Run previews · Check grades

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

Worked solution Try it yourself first
Solution query
SELECT DISTINCT
  plan,
  country
FROM
  users

The shape

DISTINCT plan, country enumerates the segment grid: one row per (plan, country) pair that actually has users in it. The marketing team gets the live cross-tab of plan-by-country directly, without having to imagine which combinations exist.

Clause by clause

  • SELECT DISTINCT plan, country returns the unique two-column combinations from whatever rows FROM hands up. The deduplication treats (plan, country) as a tuple: pro, US and pro, CA are different rows because the country differs; two users who are both pro, US collapse to one row because the tuple matches exactly.
  • FROM users is the row source — every account on the platform contributes its (plan, country) pair to the candidate set, and the deduplication runs across that set.

The result is a 27-row grid. Four plans (free, starter, pro, enterprise) and a handful of countries don't produce a full 4 × N cartesian product — some combinations have no users in them. enterprise, FR doesn't appear in the result, which means Streamhub has no enterprise customers in France today. For a region-specific plan promotion, that absence is itself a signal: it tells the marketing team where the white space is.

Why this and not enumerate plans and countries separately

Running SELECT DISTINCT plan FROM users gives four rows; SELECT DISTINCT country FROM users gives a country list. Multiplied together, that's the full theoretical grid — 4 × number-of-countries combinations. But that grid includes combinations that don't actually have users, which is misleading for a campaign aimed at existing customers. The single DISTINCT plan, country query returns only the live segments, which is the only set the team can actually target with a plan-specific promotion.

You practiced using DISTINCT to enumerate a cross-tabulation of two categorical columns. The recurring shape is exactly this: "what segments exist in my data" — DISTINCT col1, col2 produces the segment list directly.

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.