Spojení dvou Google Big Query tabulek v jednu

V H3.0 METRICS se pracuje s velkými objemy dat a snahou v rámci datové hygieny je aktualizovat jenom ta data, která dávají smysl. Takový přístup šetří čas, datové objemy, náklady na GBQ i přírodu symozřejmě. Proto se, zejména při práci s Ads Transparency daty od Meta, přistupuje k rozdělení dat do více tabulek, přičemž se aktualizuje jenom ta poslední.

Například:
– do tabulky “META_competitors_daily_2024” si uložíme data za rok 2024 a tuto už neaktualizujeme
– na tabulku “META_competitors_daily_2025” si nastavíme aktivní, pravidelně aktualizovaný datatask, který do ní bude pravidelně posílat denní data za 2025

Takto mohou vznikat i složitejší komplexy tabulek například s měsíčními daty.

Vzhledem k tomu, že ale chceme data vizualizovat společně, spojíme pro potřebu vizualizace data “do jedné tabulky”.

To se udělá tak, že se vytvoří tzv. “databázové view”, které spojí tabulky do jedné.

Toto view je pak v GBQ dispozici stejně jako jednotlivé tabulky a tak ho můžeme například napojit do Google Looker Studio jako zdroj dat.

    1. Vytvoření databázového view v Google Big Query se vytvoří spuštěním níže uvedeného query

    Pokud mají obě tabulky stejné pořadí sloupců, uděláme view spuštěním následujícího jednoduchého query:

    CREATE VIEW project.META_competitors_daily AS
    SELECT *
    FROM `project.META_competitors_daily_2024`
    UNION ALL
    SELECT *
    FROM `project.META_competitors_daily_2025`;

    V případě, že je pořadí sloupců v každé z tabulek odlišné, je jistější sloupce do view vypsat.

    Nerjdříve si zjistíme seznam všech sloupců oddělených čárkou

    SELECT STRING_AGG(column_name, ', ') AS columns
    FROM `PROJECT.INFORMATION_SCHEMA.COLUMNS`
    WHERE table_name = 'competitorsdaily2024';

    Ty pak můžeme vložit do následujího query. To spojuje dvě tabulky pro Meta Ads Transparency daily data ve struktuře platné k 3.1.2025:

    CREATE VIEW PROJECT.competitorsdaily_current AS
    SELECT
    __h30_primary_key, _h30_datatask_uuid, _h30_datatask_custom_id, _h30_datatask_name, _h30_datatask_group_name, _h30_datetime, _h30_datatype_time_incremet, _h30_datatype_level, _h30_datatype_breakdowns, target_gender, page_name, page_id, languages, eu_total_reach, ad_snapshot_url, ad_delivery_start_time, ad_delivery_stop_time, ad_creative_bodies, ad_creation_time, id, this_day_date, ad_creative_link_titles, ad_creative_link_descriptions, ad_creative_link_captions, ad_creative_body_example, ad_creative_link_description_example, ad_creative_link_title_example, payer, beneficiary, facebook, target_ages_out, publisher_platforms_out, instagram, messenger, audience_network, target_locations_out, est_frequency, est_impressions, est_cpm_eur, est_cost_eur, acgb_countries, agb_reach_unknown_total, agb_reach_female_total, agb_reach_male_total, agb_reach_65__male, agb_reach_65__female, agb_reach_65__unknown, agb_reach_65__total, agb_reach_18_24_male, agb_reach_18_24_female, agb_reach_18_24_unknown, agb_reach_18_24_total, agb_reach_25_34_male, agb_reach_25_34_female, agb_reach_25_34_unknown, agb_reach_25_34_total, agb_reach_35_44_male, agb_reach_35_44_female, agb_reach_35_44_unknown, agb_reach_35_44_total, agb_reach_45_54_male, agb_reach_45_54_female, agb_reach_45_54_unknown, agb_reach_45_54_total, agb_reach_55_64_male, agb_reach_55_64_female, agb_reach_55_64_unknown, agb_reach_55_64_total, est_cost_eur_ageweighted, days_on_air
    FROM PROJECT.competitorsdaily2024
    UNION ALL
    SELECT
    __h30_primary_key, _h30_datatask_uuid, _h30_datatask_custom_id, _h30_datatask_name, _h30_datatask_group_name, _h30_datetime, _h30_datatype_time_incremet, _h30_datatype_level, _h30_datatype_breakdowns, target_gender, page_name, page_id, languages, eu_total_reach, ad_snapshot_url, ad_delivery_start_time, ad_delivery_stop_time, ad_creative_bodies, ad_creation_time, id, this_day_date, ad_creative_link_titles, ad_creative_link_descriptions, ad_creative_link_captions, ad_creative_body_example, ad_creative_link_description_example, ad_creative_link_title_example, payer, beneficiary, facebook, target_ages_out, publisher_platforms_out, instagram, messenger, audience_network, target_locations_out, est_frequency, est_impressions, est_cpm_eur, est_cost_eur, acgb_countries, agb_reach_unknown_total, agb_reach_female_total, agb_reach_male_total, agb_reach_65__male, agb_reach_65__female, agb_reach_65__unknown, agb_reach_65__total, agb_reach_18_24_male, agb_reach_18_24_female, agb_reach_18_24_unknown, agb_reach_18_24_total, agb_reach_25_34_male, agb_reach_25_34_female, agb_reach_25_34_unknown, agb_reach_25_34_total, agb_reach_35_44_male, agb_reach_35_44_female, agb_reach_35_44_unknown, agb_reach_35_44_total, agb_reach_45_54_male, agb_reach_45_54_female, agb_reach_45_54_unknown, agb_reach_45_54_total, agb_reach_55_64_male, agb_reach_55_64_female, agb_reach_55_64_unknown, agb_reach_55_64_total, est_cost_eur_ageweighted, days_on_air
    FROM PROJECT.competitorsdaily2025;

    pro adminy – query pro výpis platných položek ceníku

    POUZE PRO ADMINY!!!!!

    výjezd platných položek ceníku z databáze pro aktuální platné datum do budoucnosti. Datumy možné měnit v query

    
    SELECT
    	seller.ic as seller_ic,
    	seller.name as seller_name,
    	web.name as web_name,
    	web.web_url as web_url,
    	section.name as section_name,
    	section.url as section_url,
    	format.name as format_name,
    	pricelist.buy_unit_days as buy_unit_days,
    	pricelist.impression as price_units_number,
    	pricelist.price as price,
    	pricelist.users as users,
    	pricelist.spec_buymodel as buying_model,
    	format.width as format_width,
    	format.height as format_height,
    	format.next_dimensions as format_next_dimensions,
    	position.description as position_description,
    	format.max_KB as format_max_KB,
    	format.max_KB as format_max_KB,
    	position.description_tp as position_description_tp,
    	pricelist.platform as platform,
    	pricelist.cat1 as cat1,
    	pricelist.cat2 as cat2,
    	pricelist.cat3 as cat3,
    	pricelist.cat4 as cat4,
    	pricelist.cat5 as cat5,
    	pricelist.cat6 as cat6,
    	pricelist.cat7 as cat7,
    	pricelist.cat8 as cat8,
    	pricelist.cat9 as cat9,
    	pricelist.cat10 as cat10,
    	pricelist.cat11 as cat11,
    	seller.mediasystem_id_buyin2 as ext_dodavatel_id,
    	web.mediasystem_id_buyin2 as ext_medium_id
    FROM edge_h20_pricelist as pricelist
    	INNER JOIN edge_h20_seller as seller ON (pricelist.id_seller = seller.id_seller)
    	INNER JOIN edge_h20_web_position as position ON (pricelist.id_position = position.id_position)
    	INNER JOIN edge_h20_web as web ON (position.id_web = web.id_web)
    	INNER JOIN edge_h20_web_section as section ON (position.id_section = section.id_section)
    	INNER JOIN edge_h20_web_position_format as format ON (position.id_format = format.id_format)
    WHERE
    	-- CURRENT_DATE() muze byt rucne psane datum ve formatu RRRR-MM-DD napr:
    	-- pricelist.valid_from <= '2020-12-24'
    	pricelist.valid_from <= CURRENT_DATE()
    AND
    	-- CURRENT_DATE() muze byt rucne psane datum ve formatu RRRR-MM-DD napr:
    	-- COALESCE(pricelist.valid_to, '9999-12-31') >= '2020-12-24'
    	COALESCE(pricelist.valid_to, '9999-12-31') >= CURRENT_DATE()
    ORDER BY
    	seller.ic ASC, seller.name ASC
    

    Nové propojení s Buyingem – with validity check

    Vzhledem k aktuálnímu bláznoství například s GDPR se v různých agenturách zvýraznila potřeba používat pouze schválené dodavatele. H3.0 na to zareagovalo další možností propojení se se systémem Buy-In2, která má zdokonalené ověřování toho, zda je dodavatel v Buy-In2 schválen a platný.
    Tato nová možnost je v Administrace/Nastavení/Propojení s ostatními systémy, kde se v sekci Buying změní volba Buying type na “Buy-In2 with validity check”.
    Poté se nebude ověřovat pouze klasické povolení dodavatele jako dosud (viz nastavení propojení s Buy-In2 (Buying) – viz Hello nový Buying = propojení s novým Buy-In2), ale bude se ověřovat přímo časově omezená platnost dodavatele, pomocí query následujícího typu (pochází od dodavatele systému Buy-In2):
    SELECT MT.IsActive, ml.main as HlavniDodavatelMediaTrueFalse,
    ml.AvailabilityFrom as VazbaMediaKDodavateliOd,
    ml.AvailabilityTo as VazbaMediaKDodavateliDo,
    cr.AvailabilityFrom as PlatnostSmluvnichVztahuOd,
    cr.AvailabilityTo as PlatnostSmluvnichVztahuDo
    from del.MAF_Media M
    inner join del.MAF_MediaTranslate MT on M.Id = MT.MediaId
    inner join del.PaS_Supplier_Media_Link ml on mt.MediaId = ml.MediaId
    inner join del.CR_ContractualRelationshipSupplierheader crsh on ml.SupplierId = crsh.SupplierId
    inner join del.CR_ContractualRelationshipSupplier crs on crsh.id = crs.ContractualRelationshipSupplierHeaderId
    inner join del.CR_ContractualRelationship cr on crs.ContractualRelationshipId = cr.id
    inner join del.CR_ContractualRelationshipHeader crh on crsh.ContractualRelationshipHeaderId = crh.id
    WHERE (M.DataMediaId = ID_SUB) AND
    (DATEFROMPARTS (2018,1,31) between ml.AvailabilityFrom and ml.AvailabilityTo) AND
    (DATEFROMPARTS (2018,1,31) between cr.AvailabilityFrom and cr.AvailabilityTo)