BigQuery dan kueri SQL Google Analytics

Nov 14 2020

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

1 GordonLinoff Nov 14 2020 at 13:01

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
GMB Nov 14 2020 at 13:00

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