BigQuery dan kueri SQL Google Analytics
Saya mencoba membuat matriks dari tabel yang diimpor dari data Google Analytics ke BigQuery. Tabel mewakili klik di situs web yang berisi session_ID bersama beberapa properti seperti url, timestamp, dll. Selain itu, ada beberapa metadata berdasarkan tindakan yang ditentukan pengguna yang kami sebut sebagai peristiwa. Di bawah ini adalah contoh tabel.
session_id hit_timestamp url event_category
1 11:12:23 url134 event1
1 11:14:23 url2234 event2
1 11:16:23 url_target null
2 03:12:11 url2344 event1
2 03:14:11 url43245 event2
3 09:10:11 url5533 event2
3 09:09:11 url_target null
4 08:08:08 url64356 event2
4 08:09:08 url56456 event2
4 08:10:08 url_target null
Hasil yang diinginkan harus seperti tabel di bawah ini.
session_id event1 event2 target
1 1 1 1
2 0 0 0
3 0 0 0
4 0 2 1
Perhatikan bahwa peristiwa apa pun yang tidak mengarah ke url_target harus dilambangkan sebagai nol termasuk target. Artinya, kueri harus melihat stempel waktu untuk memeriksa apakah ada peristiwa yang diikuti oleh url_target dengan melihat stempel waktunya. Misalnya, event2 tidak diikuti oleh "url_target", itulah mengapa kami menandainya sebagai nol. Kasus yang sama di session_id 3, karena event2 tidak diikuti oleh url_target, catat stempel waktu url_target yang sebelum event2, bukan setelahnya. Karenanya dilambangkan sebagai nol.
Saya sangat menghargai bantuan apa pun dalam membangun kueri SQL untuk menghasilkan matriks itu. Saya hanya dapat mengelompokkan berdasarkan session_id dan kemudian melakukan peristiwa penghitungan menggunakan "count", tetapi tidak dapat menemukan kueri SQL tulis untuk dicocokkan dengan stempel waktu dan memeriksa bidang lain.
Jawaban
Gunakan subkueri untuk menghitung waktu target pertama (atau terakhir). Kemudian gunakan countif()dan agregasi:
select session_id,
countif(target_hit_timestamp > hit_timestamp and category = 'event1') as event1,
countif(target_hit_timestamp > hit_timestamp and category = 'event2') as event2,
countif(url like '%target') as target
from (select t.*,
min(case when url like '%target' then hit_timestamp end) over (partition by session_id) as target_hit_timestamp
from t
) t
group by session_id
Mempertimbangkan:
select session_id,
countif(cnt_url_target > 0 and event_category = 'event1') event1,
countif(cnt_url_target > 0 and event_category = 'event2') event2,
countif(url = 'url_target') target
from (
select t.*,
countif(url = 'url_target') over(partition by session_id order by hit_timestamp desc) cnt_url_target
from mytable t
) t
group by session_id