{"id":10124,"date":"2026-09-27T19:12:00","date_gmt":"2026-09-27T17:12:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=10124"},"modified":"2026-09-25T10:49:11","modified_gmt":"2026-09-25T08:49:11","slug":"tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\/","title":{"rendered":"Tutorial: Eksport danych z GA4 do BigQuery i pierwsze zapytanie SQL"},"content":{"rendered":"<p>Interfejs GA4 odpowiada na pytania, do kt\u00f3rych zosta\u0142 zaprojektowany. Wszystko poza tym kszta\u0142tem \u2014 sekwencja stron w sesji, kohorta zdefiniowana dwoma warunkami w okre\u015blonej kolejno\u015bci, metryka, kt\u00f3rej interfejs nie oferuje \u2014 trafia na ograniczenia narz\u0119dzia raportowego zbudowanego na danych wst\u0119pnie zagregowanych. Eksport do BigQuery zdejmuje ten sufit, udost\u0119pniaj\u0105c surowy strumie\u0144 zdarze\u0144: jeden wiersz na zdarzenie, odpytywalny w SQL.<\/p>\n<p>Poni\u017cszy przewodnik obejmuje trzy rzeczy potrzebne na start: w\u0142\u0105czenie eksportu, zrozumienie, co surowe dane zawieraj\u0105, a czego nie, w por\u00f3wnaniu z interfejsem, oraz napisanie pierwszego zapytania rekonstruuj\u0105cego \u015bcie\u017cki u\u017cytkownik\u00f3w z zagnie\u017cd\u017conego schematu zdarze\u0144.<\/p>\n<figure class=\"lw-diagram\">\n<img decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/ga4-bigquery-export-pl.png\" width=\"1120\" height=\"580\" loading=\"lazy\" alt=\"Przep\u0142yw od us\u0142ugi GA4 przez po\u0142\u0105czenie BigQuery i dzienne tabele events_YYYYMMDD a\u017c po pierwsze zapytanie SQL rekonstruuj\u0105ce surowe \u015bcie\u017cki u\u017cytkownik\u00f3w w sesji\"><figcaption>Surowe wiersze zamiast agregat&oacute;w &ndash; i z tego samego powodu sumy nie zgodz&#261; si&#281; dok&#322;adnie z interfejsem.<\/figcaption><\/figure>\n<h2>Krok 1: W\u0142\u0105czenie eksportu<\/h2>\n<p>Po\u0142\u0105czenie tworzy si\u0119 w GA4 w sekcji Administracja, w obszarze po\u0142\u0105cze\u0144 z us\u0142ugami, przez po\u0142\u0105czenia BigQuery. Wymaga to uprawnie\u0144 do edycji us\u0142ugi GA4 oraz uprawnie\u0144 w\u0142a\u015bciciela docelowego projektu Google Cloud z w\u0142\u0105czonym interfejsem BigQuery API. Konfiguracja pyta o projekt Cloud, lokalizacj\u0119 danych, strumienie danych do uwzgl\u0119dnienia oraz cz\u0119stotliwo\u015b\u0107 eksportu.<\/p>\n<p>Do wyboru s\u0105 dwie cz\u0119stotliwo\u015bci i zachowuj\u0105 si\u0119 r\u00f3\u017cnie. <strong>Dzienna<\/strong> zapisuje jedn\u0105 tabel\u0119 na dob\u0119, <code>events_YYYYMMDD<\/code>, zwykle dost\u0119pn\u0105 nast\u0119pnego dnia; dla us\u0142ug standardowych jest wliczona bez op\u0142at. <strong>Strumieniowa<\/strong> zapisuje na bie\u017c\u0105co do <code>events_intraday_YYYYMMDD<\/code> i jest rozliczana wed\u0142ug stawek BigQuery za wstawianie strumieniowe. Do poznania danych i do wi\u0119kszo\u015bci analiz wystarcza sam eksport dzienny.<\/p>\n<p>Dwa ograniczenia maj\u0105 znaczenie, zanim cokolwiek na tym stanie. Eksport <strong>nie dzia\u0142a wstecz<\/strong> \u2014 zaczyna w dniu utworzenia po\u0142\u0105czenia i nie uzupe\u0142nia historii, dlatego w\u0142\u0105czenie go wcze\u015bnie op\u0142aca si\u0119 nawet bez natychmiastowego zastosowania dla danych. Us\u0142ugi standardowe podlegaj\u0105 te\u017c udokumentowanemu dziennemu limitowi eksportu wynosz\u0105cemu milion zdarze\u0144 na dob\u0119; jego przekroczenie mo\u017ce skutkowa\u0107 zawieszeniem eksportu, wi\u0119c bie\u017c\u0105cy wolumen warto zestawi\u0107 z limitem w dokumentacji Google, zanim eksport stanie si\u0119 elementem no\u015bnym.<\/p>\n<p>Po stronie BigQuery bezp\u0142atny poziom obejmuje 10 GiB przestrzeni i 1 TiB przetworzonych danych zapyta\u0144 miesi\u0119cznie, co dla pojedynczej us\u0142ugi eksplorowanej r\u0119cznie jest warto\u015bci\u0105 hojn\u0105.<\/p>\n<h2>Krok 2: Co naprawd\u0119 oznacza \u201ebez pr\u00f3bkowania\u201d<\/h2>\n<p>Unikni\u0119cie pr\u00f3bkowania w eksporcie nie jest technik\u0105 \u2014 wynika z tego, \u017ce eksport jest niezagregowanym strumieniem zdarze\u0144, a nie raportem. Trzy odr\u0119bne redukcje stosowane przez interfejs s\u0105 tam po prostu nieobecne:<\/p>\n<ul>\n<li><strong>Pr\u00f3bkowanie w eksploracjach.<\/strong> Raporty standardowe w GA4 nie s\u0105 pr\u00f3bkowane, natomiast eksploracje si\u0119gaj\u0105 po pr\u00f3bkowanie, gdy zapytanie przekroczy limit zdarze\u0144 w\u0142a\u015bciwy dla danego poziomu us\u0142ugi \u2014 wynik niesie wtedy stosown\u0105 informacj\u0119.<\/li>\n<li><strong>Wiersz <code>(other)<\/code>.<\/strong> Gdy wymiar generuje wi\u0119cej odr\u0119bnych warto\u015bci, ni\u017c raport jest w stanie pomie\u015bci\u0107, reszta zostaje zwini\u0119ta do jednego worka <code>(other)<\/code> \u2014 realny problem przy \u015bcie\u017ckach stron, identyfikatorach produkt\u00f3w czy frazach wyszukiwania.<\/li>\n<li><strong>Progi (thresholding).<\/strong> Przy aktywnych sygna\u0142ach Google wiersze reprezentuj\u0105ce bardzo niewielu u\u017cytkownik\u00f3w s\u0105 w ca\u0142o\u015bci wstrzymywane, \u017ceby nie da\u0142o si\u0119 nikogo zidentyfikowa\u0107, a zamiast danych pojawia si\u0119 informacja o zastosowaniu progu.<\/li>\n<\/ul>\n<p>\u017badna z tych trzech redukcji nie dotyczy wyeksportowanych tabel. Cen\u0105 jest to, \u017ce wszystko, co interfejs nadbudowuje nad surowymi danymi \u2014 modelowane konwersje, atrybucja oparta na danych, w\u0142asna definicja sesji \u2014 r\u00f3wnie\u017c tam nie wyst\u0119puje. W\u0142a\u015bnie dlatego sumy z BigQuery i sumy z interfejsu nie zgodz\u0105 si\u0119 dok\u0142adnie.<\/p>\n<h2>Krok 3: Kszta\u0142t danych<\/h2>\n<p>Ka\u017cdy wiersz to jedno zdarzenie. Osoby przychodz\u0105ce z klasycznego SQL najbardziej zaskakuje to, \u017ce interesuj\u0105ce warto\u015bci nie s\u0105 kolumnami: siedz\u0105 w <code>event_params<\/code>, powtarzalnym rekordzie par klucz-warto\u015b\u0107, w kt\u00f3rym sama warto\u015b\u0107 jest struktur\u0105 z osobnym polem na ka\u017cdy typ.<\/p>\n<table style=\"width:100%;border-collapse:collapse\">\n<thead>\n<tr>\n<th style=\"white-space:nowrap;vertical-align:top\">Pole<\/th>\n<th>Typ<\/th>\n<th>Co zawiera<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\"><code>event_date<\/code><\/td>\n<td>STRING<\/td>\n<td>Dzie\u0144 w formacie <code>YYYYMMDD<\/code>, zgodny z sufiksem tabeli.<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\"><code>event_timestamp<\/code><\/td>\n<td>INT64<\/td>\n<td>Mikrosekundy od epoki \u2014 klucz porz\u0105dkuj\u0105cy wewn\u0105trz sesji.<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\"><code>event_name<\/code><\/td>\n<td>STRING<\/td>\n<td><code>page_view<\/code>, <code>session_start<\/code>, <code>purchase<\/code> oraz zdarzenia w\u0142asne.<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\"><code>user_pseudo_id<\/code><\/td>\n<td>STRING<\/td>\n<td>Identyfikator klienta \u2014 urz\u0105dzenie lub przegl\u0105darka, nie osoba.<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\"><code>event_params<\/code><\/td>\n<td>REPEATED RECORD<\/td>\n<td>Pary klucz-warto\u015b\u0107: <code>ga_session_id<\/code>, <code>page_location<\/code>, <code>page_title<\/code> i pozosta\u0142e.<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\"><code>items<\/code><\/td>\n<td>REPEATED RECORD<\/td>\n<td>Produkty e-commerce powi\u0105zane ze zdarzeniem.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Sesja nie ma w\u0142asnej kolumny. Rekonstruuje si\u0119 j\u0105, \u0142\u0105cz\u0105c <code>user_pseudo_id<\/code> z parametrem <code>ga_session_id<\/code>, poniewa\u017c identyfikatory sesji s\u0105 unikalne wy\u0142\u0105cznie w obr\u0119bie jednego klienta.<\/p>\n<h2>Krok 4: Pierwsze zapytanie potwierdzaj\u0105ce, \u017ce eksport dzia\u0142a<\/h2>\n<p>Przed czymkolwiek analitycznym jedno zapytanie potwierdza, \u017ce dane nap\u0142ywaj\u0105, a odwo\u0142anie do tabeli jest poprawne:<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>SELECT\n  event_date,\n  COUNT(*) AS events,\n  COUNT(DISTINCT user_pseudo_id) AS users\nFROM `project.analytics_XXXXXXXXX.events_*`\nWHERE _TABLE_SUFFIX BETWEEN '20260920' AND '20260926'\nGROUP BY event_date\nORDER BY event_date;<\/code><\/pre>\n<p>Filtr <code>_TABLE_SUFFIX<\/code> nie jest opcjonalnym porz\u0105dkowaniem. Symbol wieloznaczny <code>events_*<\/code> odwo\u0142uje si\u0119 naraz do wszystkich tabel dziennych w zbiorze, a bez filtra sufiksu zapytanie skanuje ca\u0142\u0105 histori\u0119 eksportu \u2014 rozliczan\u0105 wed\u0142ug odczytanych bajt\u00f3w.<\/p>\n<h2>Krok 5: Wyci\u0105gni\u0119cie surowych \u015bcie\u017cek u\u017cytkownik\u00f3w<\/h2>\n<p>Zapytaniem, kt\u00f3rego interfejs nie potrafi zwr\u00f3ci\u0107, jest pe\u0142na sekwencja stron w sesji. Odczyt warto\u015bci z <code>event_params<\/code> realizuje si\u0119 podzapytaniem skalarnym po <code>UNNEST<\/code> \u2014 to konstrukcja warta zapami\u0119tania, bo powraca w ka\u017cdym zapytaniu do GA4:<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>WITH page_views AS (\n  SELECT\n    user_pseudo_id,\n    (SELECT value.int_value FROM UNNEST(event_params)\n      WHERE key = 'ga_session_id') AS session_id,\n    event_timestamp,\n    (SELECT value.string_value FROM UNNEST(event_params)\n      WHERE key = 'page_location') AS page_location\n  FROM `project.analytics_XXXXXXXXX.events_*`\n  WHERE _TABLE_SUFFIX BETWEEN '20260920' AND '20260926'\n    AND event_name = 'page_view'\n)\nSELECT\n  CONCAT(user_pseudo_id, '-', CAST(session_id AS STRING)) AS session_key,\n  COUNT(*) AS page_views,\n  STRING_AGG(\n    REGEXP_EXTRACT(page_location, r'^https?:\/\/[^\/]+([^?#]*)'),\n    ' &gt; ' ORDER BY event_timestamp\n  ) AS path\nFROM page_views\nWHERE session_id IS NOT NULL\nGROUP BY session_key\nHAVING page_views &gt; 1\nORDER BY page_views DESC\nLIMIT 100;<\/code><\/pre>\n<p>Ka\u017cdy wiersz to droga jednej sesji w kolejno\u015bci, z usuni\u0119t\u0105 domen\u0105 i query stringiem, dzi\u0119ki czemu identyczne strony grupuj\u0105 si\u0119 razem. St\u0105d ta sama struktura odpowiada na bardziej szczeg\u00f3\u0142owe pytania: ograniczenie do sesji zawieraj\u0105cych konkretne zdarzenie, policzenie, jak cz\u0119sto jedna strona poprzedza drug\u0105, albo zmierzenie, ile krok\u00f3w poprzedza zakup.<\/p>\n<h2>Pozostaj\u0105c w granicach<\/h2>\n<p>Dwie rzeczy warto ustali\u0107, zanim te dane trafi\u0105 do raportu. Liczby z eksportu nie uzgodni\u0105 si\u0119 dok\u0142adnie z interfejsem GA4 i jest to za\u0142o\u017cenie projektowe, a nie usterka do \u015bcigania: interfejs nak\u0142ada na surowe dane modelowanie i w\u0142asn\u0105 logik\u0119 sesji, kt\u00f3rych tam nie ma. Eksport niesie te\u017c dane na poziomie zdarze\u0144 dotycz\u0105ce identyfikowalnych urz\u0105dze\u0144, wi\u0119c ta sama podstawa zgody i dyscyplina retencji, kt\u00f3re obowi\u0105zuj\u0105 dla danych analitycznych, obowi\u0105zuj\u0105 r\u00f3wnie\u017c dla zbioru w Cloud \u2014 \u0142\u0105cznie z tym, komu przyznawany jest dost\u0119p do projektu.<\/p>\n<div class=\"lw-faq\">\n<h2>Pytania i odpowiedzi<\/h2>\n<h3>Czy events_* liczy zdarzenia podw\u00f3jnie, gdy w\u0142\u0105czony jest eksport strumieniowy?<\/h3>\n<p>Z filtrem sufiksu z kroku 4 nie, bez niego by\u0107 mo\u017ce tak. Symbol wieloznaczny events_* obejmuje tak\u017ce tabele events_intraday_YYYYMMDD, bo ich nazwy r\u00f3wnie\u017c zaczynaj\u0105 si\u0119 od events_. Dla nich _TABLE_SUFFIX nie brzmi wtedy 20260926, lecz intraday_20260926.<\/p>\n<p>Warunek <code>_TABLE_SUFFIX BETWEEN '20260920' AND '20260926'<\/code> wyklucza te tabele, poniewa\u017c por\u00f3wnanie odbywa si\u0119 znak po znaku, a litera i przy sortowaniu wypada za wszystkimi cyframi. Kto potrzebuje danych z bie\u017c\u0105cego dnia z tabeli intraday, musi wi\u0119c do\u0142\u0105czy\u0107 j\u0105 wprost, na przyk\u0142ad dodatkowym warunkiem <code>_TABLE_SUFFIX = 'intraday_20260927'<\/code>.<\/p>\n<p>Podw\u00f3jnie zapytanie mo\u017ce liczy\u0107 dopiero wtedy, gdy bez filtra sufiksu albo ze zbyt szerokim wzorcem obejmie oba rodzaje tabel, a dla tego samego dnia istniej\u0105 obie. Zapytanie \u0142\u0105cz\u0105ce oba \u017ar\u00f3d\u0142a powinno wi\u0119c dla ka\u017cdego dnia liczy\u0107 tylko jedno z nich.<\/p>\n<h3>Czy LIMIT 100 obni\u017ca koszt zapytania?<\/h3>\n<p>Nie. BigQuery rozlicza bajty, kt\u00f3re zapytanie musi odczyta\u0107, a LIMIT ogranicza jedynie wynik, gdy dane s\u0105 ju\u017c odczytane. Poniewa\u017c BigQuery przechowuje dane kolumnami, oszcz\u0119dzaj\u0105 natomiast dwa inne zabiegi: wyb\u00f3r tylko potrzebnych kolumn zamiast SELECT * oraz filtr na _TABLE_SUFFIX, kt\u00f3ry wy\u0142\u0105cza z rachunku ca\u0142e tabele dzienne.<\/p>\n<h3>Czy okres przechowywania ustawiony w GA4 dotyczy tak\u017ce tabel w BigQuery?<\/h3>\n<p>Nie. Ustawienie przechowywania danych w GA4 dotyczy danych w samym GA4. To, co raz trafi\u0142o do BigQuery, le\u017cy tam jako osobna kopia w projekcie Cloud i zostaje, dop\u00f3ki nie zostanie tam usuni\u0119te. Pozostawiony sam sobie zbi\u00f3r ro\u015bnie wi\u0119c z dnia na dzie\u0144, a razem z nim zajmowana przestrze\u0144, kt\u00f3ra mo\u017ce w ko\u0144cu przekroczy\u0107 bezp\u0142atne 10 GiB.<\/p>\n<p>Dyscyplin\u0119 retencji, kt\u00f3rej artyku\u0142 wymaga tak\u017ce dla zbioru, trzeba zatem ustawi\u0107 w BigQuery. S\u0142u\u017cy do tego domy\u015blny czas wyga\u015bni\u0119cia tabel ustawiany na zbiorze (w API pole defaultTableExpirationMs); nowe tabele dzienne s\u0105 wtedy usuwane automatycznie po up\u0142ywie tego okresu. Dotyczy to wy\u0142\u0105cznie tabel utworzonych po zmianie; starsze tabele potrzebuj\u0105 w\u0142asnego czasu wyga\u015bni\u0119cia albo usuwa si\u0119 je r\u0119cznie.<\/p>\n<h3>Czy eksport dzia\u0142a tak\u017ce bez konta rozliczeniowego w Google Cloud?<\/h3>\n<p>Tak, BigQuery dzia\u0142a wtedy jako piaskownica (sandbox), ale z dwoma ograniczeniami, kt\u00f3re dla GA4 maj\u0105 znaczenie. Tabele w piaskownicy wygasaj\u0105 po 60 dniach, wi\u0119c eksport dzienny nigdy nie przechowuje wi\u0119cej ni\u017c oko\u0142o dw\u00f3ch miesi\u0119cy. Eksport strumieniowy nie jest tam natomiast dost\u0119pny. Do poznania danych to wystarcza; zbudowanie d\u0142ugiego szeregu czasowego wymaga konta rozliczeniowego, nawet je\u015bli wykorzystanie mie\u015bci si\u0119 w ramach bezp\u0142atnego poziomu.<\/p>\n<\/div>\n<div class=\"lw-quellen\">\n<h2>\u0179r\u00f3d\u0142a<\/h2>\n<ul>\n<li><a href=\"https:\/\/developers.google.com\/analytics\/devguides\/collection\/ga4\" target=\"_blank\" rel=\"noopener noreferrer\">Google Analytics 4 developer guide<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>W\u0142\u0105czenie bezp\u0142atnego dziennego eksportu GA4 do BigQuery, zrozumienie, dlaczego wyeksportowane wiersze nie nios\u0105 pr\u00f3bkowania, worka o du\u017cej liczbie warto\u015bci ani prog\u00f3w stosowanych przez interfejs, oraz napisanie pierwszego zapytania rekonstruuj\u0105cego surowe \u015bcie\u017cki u\u017cytkownik\u00f3w z zagnie\u017cd\u017conego schematu zdarze\u0144.<\/p>\n","protected":false},"author":1,"featured_media":13832,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[117],"tags":[92084,92100,92103,92238,92116],"class_list":["post-10124","post","type-post","status-publish","format-standard","hentry","category-tutorials-pl","tag-bigquery-pl","tag-google-analytics-4-pl","tag-google-cloud-pl","tag-tutorial-pl","tag-web-analytics-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tutorial: Eksport danych z GA4 do BigQuery i pierwsze zapytanie SQL | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"W\u0142\u0105czenie dziennego eksportu GA4 do BigQuery, zrozumienie, co interfejs robi z liczbami, i pierwsze zapytanie na zagnie\u017cd\u017conym schemacie zdarze\u0144.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tutorial: Eksport danych z GA4 do BigQuery i pierwsze zapytanie SQL | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"W\u0142\u0105czenie dziennego eksportu GA4 do BigQuery, zrozumienie, co interfejs robi z liczbami, i pierwsze zapytanie na zagnie\u017cd\u017conym schemacie zdarze\u0144.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-27T17:12:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10124-tutorial-eksport-danych-z-ga4-do-big-g.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Tutorial: Eksport danych z GA4 do BigQuery i pierwsze zapytanie SQL\",\"datePublished\":\"2026-09-27T17:12:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\\\/\"},\"wordCount\":1405,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10124-tutorial-eksport-danych-z-ga4-do-big-g.png\",\"keywords\":[\"BigQuery\",\"Google Analytics 4\",\"Google Cloud\",\"Tutorial\",\"Web Analytics\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\\\/\",\"name\":\"Tutorial: Eksport danych z GA4 do BigQuery i pierwsze zapytanie SQL | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10124-tutorial-eksport-danych-z-ga4-do-big-g.png\",\"datePublished\":\"2026-09-27T17:12:00+00:00\",\"description\":\"W\u0142\u0105czenie dziennego eksportu GA4 do BigQuery, zrozumienie, co interfejs robi z liczbami, i pierwsze zapytanie na zagnie\u017cd\u017conym schemacie zdarze\u0144.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10124-tutorial-eksport-danych-z-ga4-do-big-g.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10124-tutorial-eksport-danych-z-ga4-do-big-g.png\",\"width\":1200,\"height\":630,\"caption\":\"Tutorial: Eksport danych z GA4 do BigQuery i pierwsze zapytanie SQL\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorial: Eksport danych z GA4 do BigQuery i pierwsze zapytanie SQL\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tutorial: Eksport danych z GA4 do BigQuery i pierwsze zapytanie SQL | Lukas Wojcik","description":"W\u0142\u0105czenie dziennego eksportu GA4 do BigQuery, zrozumienie, co interfejs robi z liczbami, i pierwsze zapytanie na zagnie\u017cd\u017conym schemacie zdarze\u0144.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\/","og_locale":"en_US","og_type":"article","og_title":"Tutorial: Eksport danych z GA4 do BigQuery i pierwsze zapytanie SQL | Lukas Wojcik","og_description":"W\u0142\u0105czenie dziennego eksportu GA4 do BigQuery, zrozumienie, co interfejs robi z liczbami, i pierwsze zapytanie na zagnie\u017cd\u017conym schemacie zdarze\u0144.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-27T17:12:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10124-tutorial-eksport-danych-z-ga4-do-big-g.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Tutorial: Eksport danych z GA4 do BigQuery i pierwsze zapytanie SQL","datePublished":"2026-09-27T17:12:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\/"},"wordCount":1405,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10124-tutorial-eksport-danych-z-ga4-do-big-g.png","keywords":["BigQuery","Google Analytics 4","Google Cloud","Tutorial","Web Analytics"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\/","name":"Tutorial: Eksport danych z GA4 do BigQuery i pierwsze zapytanie SQL | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10124-tutorial-eksport-danych-z-ga4-do-big-g.png","datePublished":"2026-09-27T17:12:00+00:00","description":"W\u0142\u0105czenie dziennego eksportu GA4 do BigQuery, zrozumienie, co interfejs robi z liczbami, i pierwsze zapytanie na zagnie\u017cd\u017conym schemacie zdarze\u0144.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10124-tutorial-eksport-danych-z-ga4-do-big-g.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10124-tutorial-eksport-danych-z-ga4-do-big-g.png","width":1200,"height":630,"caption":"Tutorial: Eksport danych z GA4 do BigQuery i pierwsze zapytanie SQL"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-eksport-danych-z-ga4-do-bigquery-i-pierwsze-zapytanie-sql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Tutorial: Eksport danych z GA4 do BigQuery i pierwsze zapytanie SQL"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10124","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=10124"}],"version-history":[{"count":4,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10124\/revisions"}],"predecessor-version":[{"id":20723,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10124\/revisions\/20723"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/13832"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=10124"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=10124"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10124"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}