Learn SQL/Advanced/Subqueries/SQL Nested Subqueries

SQL Nested Subqueries

A subquery inside a subquery — each layer resolves before the one wrapping it.

What & Why

Subqueries can nest more than one level deep. Postgres resolves from the innermost query outward — each layer becomes a plain value (or list, or table) for the layer around it.

See How It Works

BUSINESS QUESTION

Find campaigns above the average spend of channels that have produced a lead.

idnamechannelspendstart_dateend_datestatustarget_segment
1Spring Launchgoogle_ads55000.002024-01-152024-03-31activesmb
2Retention Webinaremail45000.002024-02-102024-04-15activeenterprise
3Finance Retargetinglinkedin50000.002024-03-122024-05-31activeenterprise
4Enterprise Searchgoogle_ads60000.002024-04-012024-06-30activeenterprise
idcampaign_idemailcreated_atqualified_atconverted_atlead_scoresourcecountry
3011ana@example.com2024-01-21 09:10:00+002024-01-22 11:00:00+002024-02-02 10:00:00+0086google_adsUS
3021ben@example.com2024-01-24 12:40:00+00NULLNULL52google_adsCA
3032chloe@example.com2024-02-16 08:30:00+002024-02-18 14:20:00+00NULL74emailGB
3043dev@example.com2024-03-20 17:15:00+002024-03-21 09:00:00+002024-04-04 16:00:00+0091linkedinUS
EXAMPLE QUERY
SELECT
  name,
  channel,
  spend
FROM marketing.campaigns
WHERE spend > (
  SELECT AVG(spend)
  FROM marketing.campaigns
  WHERE id IN (
    SELECT DISTINCT campaign_id
    FROM marketing.leads
    WHERE campaign_id IS NOT NULL
  )
)
ORDER BY spend DESC, name;
RESULT — above the 50,000 qualifying-campaign average
namechannelspend
Enterprise Searchgoogle_ads60000.00
Spring Launchgoogle_ads55000.00

The inner ID set is 1, 2, and 3, whose average spend is 50,000.

This lesson's practice is part of Pro.

Advanced business practice

Sign up free to try it on a real business scenario