From a9f63237153e6cdac14fef54c70cea4ebdcaf947 Mon Sep 17 00:00:00 2001 From: Jonas Linter Date: Wed, 26 Nov 2025 11:30:04 +0000 Subject: [PATCH] unified_insights sein iatz stabiler --- src/meta_api_grabber/db_schema.sql | 107 ++++++++++++++++++++++------- 1 file changed, 81 insertions(+), 26 deletions(-) diff --git a/src/meta_api_grabber/db_schema.sql b/src/meta_api_grabber/db_schema.sql index 859697c..c6b17b6 100644 --- a/src/meta_api_grabber/db_schema.sql +++ b/src/meta_api_grabber/db_schema.sql @@ -480,6 +480,22 @@ FROM ( GROUP BY google_account_id, time, customer_currency_code, account_name ) base; +DROP VIEW IF EXISTS g_account_insights_by_country CASCADE; + +CREATE VIEW g_account_insights_by_country AS +select segments_date as time, customer_id as google_account_id, + g.metrics_clicks as clicks, + g.metrics_impressions as impressions, + g.metrics_cost_micros as cost_micros, + g.metrics_cost_micros / 1000000.0 as cost, + g.metrics_conversions as conversions, + g.metrics_conversions_value as conversion_value, + metrics_interactions as interactions, + m.country_code + from google.geo_view_with_metrics as g join geotargets as m on m.criteria_id = + g.geographic_view_country_criterion_id + order by time; + DROP VIEW IF EXISTS g_account_insights_device CASCADE; @@ -581,22 +597,23 @@ DROP VIEW IF EXISTS unified_account_insights CASCADE; CREATE VIEW unified_account_insights AS SELECT - g.time, + COALESCE(g.time, m.time) as time, g.google_account_id::varchar as google_account_id, m.account_id as meta_account_id, - sum(g.impressions + m.impressions) as impressions, - sum(g.clicks + m.clicks) as clicks, - sum(g.clicks + m.link_click) as link_click, + SUM(COALESCE(g.impressions, 0) + COALESCE(m.impressions, 0)) as impressions, + SUM(COALESCE(g.clicks, 0) + COALESCE(m.clicks, 0)) as clicks, + SUM(COALESCE(g.clicks, 0) + COALESCE(m.link_click, 0)) as link_clicks, + sum(g.leads + m.lead) as lead, - sum(g.cost + m.spend) as spend + SUM(COALESCE(g.cost, 0) + COALESCE(m.spend, 0)) as spend FROM account_metadata as am -JOIN g_account_insights as g ON g.google_account_id::varchar = am.google_account_id -JOIN account_insights as m ON m.account_id = am.meta_account_id AND m.time = g.time -GROUP BY g.time, 2, 3 -ORDER BY g.time; +FULL OUTER JOIN g_account_insights as g ON g.google_account_id::varchar = am.google_account_id +FULL OUTER JOIN account_insights as m ON m.account_id = am.meta_account_id AND m.time = g.time +GROUP BY 1, 2, 3 +ORDER BY 1; -- Unified device-level insights combining Google and Meta data DROP VIEW IF EXISTS unified_account_insights_by_device CASCADE; @@ -604,7 +621,7 @@ DROP VIEW IF EXISTS unified_account_insights_by_device CASCADE; CREATE VIEW unified_account_insights_by_device AS -- Man verliert Tablet und mobile-app als device type ober who cares. TV und so bei google werd a als mobile innigschmisse. Taucht lei olle heiligen zeiten auf SELECT - g.time, + COALESCE(g.time, m.time) as time, g.google_account_id::varchar as google_account_id, m.account_id as meta_account_id, -- Normalize device types @@ -612,23 +629,32 @@ SELECT WHEN UPPER(COALESCE(g.device, m.device_platform)) IN ('DESKTOP') THEN 'DESKTOP' ELSE 'MOBILE' END as device_type, - SUM(g.impressions) as google_impressions, - SUM(m.impressions) as meta_impressions, - SUM(g.impressions + m.impressions) as total_impressions, - SUM(g.clicks) as google_clicks, - SUM(m.clicks) as meta_clicks, - SUM(g.clicks + m.clicks) as total_clicks, - SUM(g.cost) as google_cost, - SUM(m.spend) as meta_spend, - SUM(g.cost + m.spend) as total_spend, - SUM(m.link_click) as meta_link_clicks, - SUM(m.lead) as meta_leads + SUM(COALESCE(g.impressions, 0) + COALESCE(m.impressions, 0)) as impressions, + SUM(COALESCE(g.clicks, 0) + COALESCE(m.clicks, 0)) as clicks, + SUM(COALESCE(g.clicks, 0) + COALESCE(m.link_click, 0)) as link_clicks, + SUM(COALESCE(g.cost, 0) + COALESCE(m.spend, 0)) as spend FROM account_metadata as am -FULL OUTER JOIN g_account_insights_device as g ON g.google_account_id::varchar = am.google_account_id -FULL OUTER JOIN account_insights_by_device as m ON m.account_id = am.meta_account_id AND m.time = g.time -WHERE g.time IS NOT NULL AND m.time IS NOT NULL -GROUP BY g.time, g.google_account_id, m.account_id, device_type -ORDER BY g.time, device_type; +FULL OUTER JOIN g_account_insights_device as g + ON g.google_account_id::varchar = am.google_account_id +FULL OUTER JOIN account_insights_by_device as m + ON m.account_id = am.meta_account_id + AND m.time = g.time + AND CASE + WHEN UPPER(g.device) IN ('DESKTOP') THEN 'DESKTOP' + ELSE 'MOBILE' + END = CASE + WHEN UPPER(m.device_platform) IN ('DESKTOP') THEN 'DESKTOP' + ELSE 'MOBILE' + END +GROUP BY + COALESCE(g.time, m.time), + g.google_account_id, + m.account_id, + CASE + WHEN UPPER(COALESCE(g.device, m.device_platform)) IN ('DESKTOP') THEN 'DESKTOP' + ELSE 'MOBILE' + END +ORDER BY 1, device_type; -- Unified gender-level insights combining Google and Meta data for better audience analysis DROP VIEW IF EXISTS unified_account_insights_by_gender CASCADE; @@ -649,4 +675,33 @@ FROM account_insights_by_gender as m GROUP BY m.time, m.account_id, m.gender ORDER BY m.time; +DROP VIEW IF EXISTS unified_account_insights_by_country CASCADE; + +CREATE VIEW unified_account_insights_by_country AS +SELECT + COALESCE(g.time, m.time) as time, + g.google_account_id::varchar as google_account_id, + m.account_id as meta_account_id, + COALESCE(g.country_code, m.country) as country_code, + SUM(g.impressions) as google_impressions, + SUM(m.impressions) as meta_impressions, + SUM(COALESCE(g.impressions, 0) + COALESCE(m.impressions, 0)) as total_impressions, + SUM(g.clicks) as google_clicks, + SUM(m.clicks) as meta_clicks, + SUM(COALESCE(g.clicks, 0) + COALESCE(m.clicks, 0)) as total_clicks, + SUM(g.cost) as google_cost, + SUM(m.spend) as meta_spend, + SUM(COALESCE(g.cost, 0) + COALESCE(m.spend, 0)) as total_spend, + SUM(m.link_click) as meta_link_clicks, + SUM(m.lead) as meta_leads +FROM account_metadata as am +FULL OUTER JOIN g_account_insights_by_country as g + ON g.google_account_id::varchar = am.google_account_id +FULL OUTER JOIN account_insights_by_country as m + ON m.account_id = am.meta_account_id + AND m.time = g.time + AND m.country = g.country_code +GROUP BY COALESCE(g.time, m.time), g.google_account_id, m.account_id, COALESCE(g.country_code, m.country) +ORDER BY COALESCE(g.time, m.time); +