Jak pracować z polami zagnieżdżonymi (nested fields) z ChatGPT
Jeśli korzystasz z eksportu danych z Google Analytics 4 do BigQuery, prędzej czy później trafisz na ten sam problem:
dane, których szukasz, nie są „normalnymi kolumnami”.
Zamiast tego znajdują się w strukturach zagnieżdżonych, takich jak event_params, user_properties czy items.
Dla wielu osób to moment frustracji — „przecież ten parametr jest wysyłany, dlaczego go nie widzę?”
Ten artykuł pokazuje dokładnie, jak wydobywać (extractować) zagnieżdżone pola z GA4 BigQuery, krok po kroku, bez magii i bez zgadywania.
Uwaga: artykuł odnosi się do narzędzia GA4 BigQuery Composer By Optimize Smart (Himanshu)

Dlaczego GA4 zapisuje dane jako pola zagnieżdżone?
GA4 został zaprojektowany jako system event-based, a nie sesyjny jak Universal Analytics.
Każde zdarzenie (event) może mieć dowolną liczbę parametrów, dlatego Google przechowuje je w elastycznej strukturze:
event_params→ tablica (ARRAY)- każdy element tablicy → struktura (STRUCT)
- każda struktura → para
key+value

Dzięki temu GA4 może przechowywać setki parametrów bez tworzenia setek kolumn — ale kosztem prostoty zapytań SQL.
Najczęstszy przykład: gdzie jest page_location?
W GA4 UI page_location widzisz bez problemu.
W BigQuery… nie ma takiej kolumny.
Dlaczego?
Bo page_location jest parametrem zdarzenia, zapisanym wewnątrz:
event_params.key = 'page_location'
Twoim zadaniem jest:
- „rozpakować” tablicę
event_params - znaleźć element z właściwym kluczem
- pobrać odpowiednią wartość (
string_value,int_valueitd.)
Krok 1: Zidentyfikuj parametr, którego szukasz
Zanim napiszesz zapytanie, musisz wiedzieć:
- dokładną nazwę parametru (case-sensitive)
- typ wartości (najczęściej
string_value)
Przykłady:
page_location→ stringpage_title→ stringengagement_time_msec→ intutm_campaign→ string
Krok 2: Podstawowa struktura zapytania
Pracujemy na tabelach:events_YYYYMMDD
Każda tabela zawiera:
- jedno zdarzenie = jeden wiersz
- parametry zdarzenia =
event_params(ARRAY)
Minimalny szkielet zapytania wygląda tak:
SELECT
event_date,
event_name
FROM
`twoj_projekt.twoj_dataset.events_20251101`
To jest punkt wyjścia.
Krok 3: Wyciągnięcie wartości z event_params
Aby pobrać np. page_location, używamy podzapytania skalarnego:
(
SELECT value.string_value
FROM UNNEST(event_params)
WHERE key = 'page_location'
) AS page_location
Pełne zapytanie:
SELECT
event_date,
event_name,
(
SELECT value.string_value
FROM UNNEST(event_params)
WHERE key = 'page_location'
) AS page_location
FROM
`twoj_projekt.twoj_dataset.events_20251101`
WHERE
event_name = 'page_view'
LIMIT 10
Efekt:
- każda odsłona strony ma przypisany URL
- brak
(not set) - pełna kontrola nad danymi
Krok 4: Dodanie kolejnego parametru (np. content_group)
Możesz wyciągnąć dowolną liczbę parametrów, powielając ten sam schemat:

Możesz wyciągnąć dowolną liczbę parametrów, powielając ten sam schemat:
SELECT
event_date,
event_name,
(
SELECT value.string_value
FROM UNNEST(event_params)
WHERE key = 'page_location'
) AS page_location,
(
SELECT value.string_value
FROM UNNEST(event_params)
WHERE key = 'content_group'
) AS content_group
FROM
`twoj_projekt.twoj_dataset.events_20251101`
WHERE
event_name = 'page_view'
LIMIT 10
Krok 5: Filtrowanie po wartości parametru
Chcesz np. tylko strony z określonej grupy treści?



Dodajesz warunek:
WHERE
event_name = 'page_view'
AND (
SELECT value.string_value
FROM UNNEST(event_params)
WHERE key = 'content_group'
) = 'Google Analytics'
To bardzo potężny mechanizm — pozwala analizować:
- konkretne sekcje serwisu
- kampanie
- typy użytkowników
- wersje aplikacji
- wszystko, co wysyłasz jako parametr
Krok 6: Najczęstsze błędy (i jak ich uniknąć)
1. Zły typ wartości
Jeśli parametr jest liczbowy, a użyjesz string_value → dostaniesz NULL.
2. Parametr nie istnieje w danym evencie
Nie każdy event ma każdy parametr. To normalne.
3. Mylenie custom dimension z parametrem
Custom dimension to tylko „etykieta raportowa”.
W BigQuery zawsze pracujesz na parametrze, nie na wymiarze.
4. Oczekiwanie danych historycznych
Jeśli parametr nie był wysyłany wcześniej — danych nie będzie. BigQuery nie „uzupełnia wstecz”.

Dlaczego warto opanować nested fields w GA4?
Bo wtedy:
- przestajesz polegać na ograniczeniach interfejsu GA4
- masz dostęp do 100% surowych danych
- unikasz
(not set) - budujesz własne modele atrybucji
- kontrolujesz jakość danych, a nie zgadujesz
To jest moment, w którym GA4 przestaje być czarną skrzynką, a zaczyna być normalnym systemem danych.