Рост стоимости клика по кампаниям, вымышленный мебельный магазин
SQL, по которому посчитано
WITH bounds AS (
SELECT
date_trunc('month', max(date))::DATE AS current_month,
(date_trunc('month', max(date)) - INTERVAL '1 month')::DATE AS previous_month
FROM ads
),
monthly AS (
SELECT
source,
campaign,
date_trunc('month', date)::DATE AS month_start,
sum(clicks) AS clicks,
sum(cost) AS cost
FROM ads
WHERE date >= (SELECT previous_month FROM bounds)
AND date < (SELECT current_month FROM bounds) + INTERVAL '1 month'
GROUP BY source, campaign, month_start
),
pivoted AS (
SELECT
source,
campaign,
max(CASE WHEN month_start = (SELECT current_month FROM bounds) THEN clicks END) AS clicks_current,
max(CASE WHEN month_start = (SELECT previous_month FROM bounds) THEN clicks END) AS clicks_previous,
max(CASE WHEN month_start = (SELECT current_month FROM bounds) THEN cost END) AS cost_current,
max(CASE WHEN month_start = (SELECT previous_month FROM bounds) THEN cost END) AS cost_previous
FROM monthly
GROUP BY source, campaign
)
SELECT
source || ' / ' || campaign AS campaign_label,
source,
campaign,
clicks_previous,
clicks_current,
round(cost_previous / nullif(clicks_previous, 0), 2) AS cpc_previous_rub,
round(cost_current / nullif(clicks_current, 0), 2) AS cpc_current_rub,
round(
(cost_current / nullif(clicks_current, 0)) /
nullif(cost_previous / nullif(clicks_previous, 0), 0) - 1,
4
) AS cpc_growth
FROM pivoted
WHERE clicks_previous > 0
AND clicks_current > 0
ORDER BY cpc_growth DESC NULLS LAST
LIMIT 30