-- pSEO article data: per-country padel market overview. -- One row per country — consumed by the country-overview.md.jinja template. -- Aggregates city-level data from pseo_city_costs_de. -- -- top_city_slugs / top_city_names are ordered lists (up to 5) used to generate -- internal links from the country hub to its top city pages. MODEL ( name serving.pseo_country_overview, kind FULL, cron '@daily', grain country_slug ); SELECT country_code, country_name_en, country_slug, COUNT(*) AS city_count, SUM(padel_venue_count) AS total_venues, ROUND(AVG(market_score), 1) AS avg_market_score, MAX(market_score) AS top_city_market_score, -- Top 5 cities by market score for internal linking (DuckDB list slice syntax) LIST(city_slug ORDER BY market_score DESC NULLS LAST)[1:5] AS top_city_slugs, LIST(city_name ORDER BY market_score DESC NULLS LAST)[1:5] AS top_city_names, -- Pricing medians across cities (NULL when no Playtomic coverage in country) ROUND(MEDIAN(median_hourly_rate), 0) AS median_hourly_rate, ROUND(MEDIAN(median_peak_rate), 0) AS median_peak_rate, ROUND(MEDIAN(median_offpeak_rate), 0) AS median_offpeak_rate, -- Use the most common currency in the country (MIN is deterministic for single-currency countries) MIN(price_currency) AS price_currency, SUM(population) AS total_population, CURRENT_DATE AS refreshed_date FROM serving.pseo_city_costs_de GROUP BY country_code, country_name_en, country_slug -- Only countries with enough cities to be worth a hub page HAVING COUNT(*) >= 2