cswork / libraryOpen practice workspace

Coding questions · ByteDance

Campaign Efficiency Metrics and Below-Average CTR

Practice a data scientist SQL interview question that calculates campaign cost and funnel rates, handles zero denominators, and filters campaigns against an average CTR benchmark. The exercise tests PostgreSQL date arithmetic, CTE organization, NULL-safe calculations, and deterministic output.

You are given an ad_campaigns table with one row per campaign:

ColumnTypeMeaning
campaign_idINTEGERUnique campaign identifier
campaign_nameVARCHARCampaign name
start_dateDATEFirst active date, inclusive
end_dateDATELast active date, inclusive
daily_budgetDECIMALPlanned budget per active day
impressionsINTEGERRecorded impressions
clicksINTEGERRecorded clicks
conversionsINTEGERRecorded conversions

For this console, use PostgreSQL and the following explicit assumptions: campaign dates are inclusive, each row covers one entire campaign, and daily_budget is constant across its active dates.

Write one query that returns only campaigns whose campaign-level click-through rate is below the arithmetic mean of the valid campaign-level click-through rates.

Return these columns:

  • campaign_id
  • campaign_name
  • total_cost: daily_budget multiplied by the inclusive number of active dates
  • ctr: clicks / impressions
  • conversion_rate: conversions / clicks
  • cost_per_conversion: total_cost / conversions

Use decimal division. When a denominator is zero, return NULL for that rate rather than raising an error. Campaigns with zero impressions do not contribute to the average CTR and cannot be classified as below it. Order the final rows by campaign_id.

After writing the query, be prepared to explain whether daily_budget × active_days represents actual spend or only planned budget.

Find Campaigns with Below-Average Click-Through Rate

Using PostgreSQL, compute each campaign's total_cost as daily_budget multiplied by the inclusive number of active dates, ctr as clicks / impressions, conversion_rate as conversions / clicks, and cost_per_conversion as total_cost / conversions. Use decimal division and return NULL whenever a rate's denominator is zero. Compute the arithmetic mean over campaign-level CTR values for campaigns with nonzero impressions, then return only campaigns whose CTR is strictly below that mean. Campaigns with zero impressions neither contribute to the mean nor qualify as below it. Return campaign_id, campaign_name, total_cost, ctr, conversion_rate, and cost_per_conversion ordered by campaign_id.

Table ad_campaigns

columntypeconstraints
campaign_idINTEGERPRIMARY KEY
campaign_nameTEXTNOT NULL
start_dateDATENOT NULL
end_dateDATENOT NULL
daily_budgetNUMERIC(12,2)NOT NULL
impressionsINTEGERNOT NULL
clicksINTEGERNOT NULL
conversionsINTEGERNOT NULL

Sample data:

campaign_idcampaign_nameclicksconversionsdaily_budgetend_dateimpressionsstart_date
1Awareness5051002025-01-1010002025-01-01
2One Day Launch10002002025-01-0510002025-01-05
3No Delivery00502025-01-0302025-01-01
4Leap Weekend4010802024-03-012002024-02-28
5Retargeting202302025-05-124002025-05-10

Expected output

campaign_idcampaign_nametotal_costctrconversion_ratecost_per_conversion
1Awareness10000.050.1200
5Retargeting900.050.145

Hints

  1. Build one campaign-level metrics CTE before calculating the average CTR.
  2. Subtracting PostgreSQL DATE values gives the number of boundaries crossed; add one for inclusive dates.
  3. NULLIF protects each denominator, and AVG naturally ignores NULL CTR values.