Ringkasan fungsi utama Google BigQuery dan contoh kueri untuk analisis pemasaran

Google BigQuery adalah penyimpanan Big Data yang cepat, hemat biaya, dan dapat diskalakan yang dapat Anda gunakan jika Anda tidak memiliki kemampuan atau keinginan untuk menghosting server Anda sendiri. Di dalamnya, Anda dapat menulis kueri menggunakan sintaks seperti SQL, standar, dan fungsi yang ditentukan pengguna .



Dalam artikel ini, saya akan memberi tahu Anda tentang fungsi utama BigQuery dan menunjukkan kemampuannya dengan contoh spesifik. Anda dapat menulis kueri dasar dan mencobanya pada data demo.



Apa itu SQL dan dialek apa yang dimilikinya



SQL (Structured Query Language) adalah bahasa kueri terstruktur untuk bekerja dengan database. Dengan bantuannya, Anda dapat menerima, menambahkan ke database, dan mengubah data dalam jumlah besar. Google BigQuery mendukung dua dialek: SQL Standar dan SQL Lama.



Dialek mana yang harus dipilih bergantung pada preferensi Anda, tetapi Google merekomendasikan penggunaan SQL Standar karena sejumlah keuntungan:



  • Fleksibilitas dan fungsionalitas saat bekerja dengan bidang bersarang dan berulang.
  • Dukungan untuk bahasa DML dan DDL , yang memungkinkan Anda mengubah data dalam tabel, serta memanipulasi tabel dan tampilan di GBQ.
  • Memproses data dalam jumlah besar lebih cepat daripada SQL Legasy.
  • Dukungan untuk semua pembaruan BigQuery saat ini dan di masa mendatang.


Anda dapat mempelajari lebih lanjut tentang perbedaan antara dialek di bantuan .



Secara default, kueri Google BigQuery dijalankan terhadap SQL Lama.



Ada beberapa cara untuk beralih ke SQL Standar:



  1. Di antarmuka BigQuery, di jendela pengeditan kueri, pilih "Tampilkan Opsi" dan hapus centang pada kotak di samping opsi "Gunakan SQL Lama"



  2. Tambahkan baris #standardSQL sebelum kueri dan mulai kueri di baris baru



Mulai dari mana



Agar Anda dapat berlatih menjalankan kueri secara paralel dengan membaca artikel, saya telah menyiapkan tabel dengan data demo untuk Anda . Muat data dari spreadsheet ke dalam proyek Google BigQuery Anda.



Jika Anda belum memiliki proyek GBQ, buatlah . Untuk melakukan ini, Anda memerlukan akun penagihan aktif di Google Cloud Platform . Anda perlu menautkan kartu, tetapi tanpa sepengetahuan Anda, uang tidak akan didebit darinya, terlebih lagi, setelah mendaftar, Anda akan menerima $ 300 selama 12 bulan , yang dapat Anda gunakan untuk menyimpan dan memproses data.



Fitur Google BigQuery



Grup fungsi yang paling umum digunakan saat membuat kueri adalah fungsi Agregat, fungsi Tanggal, fungsi String, dan fungsi Jendela. Sekarang lebih banyak tentang masing-masing.



Fungsi agregat



Fungsi agregasi memungkinkan Anda mendapatkan nilai ringkasan di seluruh tabel. Misalnya, hitung cek rata-rata, pendapatan bulanan total, atau sorot segmen pengguna yang melakukan jumlah pembelian maksimum.



Berikut adalah fitur paling populer dari bagian ini:

SQL lama SQL standar Apa fungsinya
AVG (bidang) AVG ([DISTINCT] (bidang)) Mengembalikan rata-rata kolom kolom. Dalam SQL Standar saat menambahkan klausa DISTINCT, rata-rata dihitung hanya untuk baris dengan nilai unik (bukan duplikat) dari kolom kolom
MAX (bidang) MAX (bidang) Mengembalikan nilai maksimum dari kolom bidang
MIN (bidang) MIN (bidang) Mengembalikan nilai minimum dari kolom bidang
SUM (bidang) SUM (bidang) Mengembalikan jumlah nilai dari kolom bidang
JUMLAH (bidang) JUMLAH (bidang) Mengembalikan jumlah baris di bidang kolom
EXACT_COUNT_DISTINCT (bidang) JUMLAH ([DISTINCT] (bidang)) Mengembalikan jumlah baris unik di kolom bidang


Anda dapat menemukan daftar semua fungsi di Help: Legacy SQL dan Standard SQL .



Mari kita lihat bagaimana fungsi yang terdaftar bekerja dengan contoh data demo. Mari kita hitung pendapatan rata-rata dari transaksi, pembelian dengan jumlah tertinggi dan terendah, total pendapatan dan jumlah semua transaksi. Untuk memeriksa apakah pembelian diduplikasi, kami juga akan menghitung jumlah transaksi unik. Untuk melakukannya, kami menulis kueri di mana kami menunjukkan nama proyek Google BigQuery, kumpulan data, dan tabel kami.



#legal SQL

SELECT
  AVG(revenue) as average_revenue,
  MAX(revenue) as max_revenue,
  MIN(revenue) as min_revenue,
  SUM(revenue) as whole_revenue,
  COUNT(transactionId) as transactions,
  EXACT_COUNT_DISTINCT(transactionId) as unique_transactions
FROM
  [owox-analytics:t_kravchenko.Demo_data]


#standar SQL

SELECT
  AVG(revenue) as average_revenue,
  MAX(revenue) as max_revenue,
  MIN(revenue) as min_revenue,
  SUM(revenue) as whole_revenue,
  COUNT(transactionId) as transactions,
  COUNT(DISTINCT(transactionId)) as unique_transactions
FROM
  `owox-analytics.t_kravchenko.Demo_data`


Hasilnya, kami mendapatkan hasil sebagai berikut:







Anda dapat memeriksa hasil perhitungan di tabel asli dengan data demo menggunakan fungsi Google Sheets standar (SUM, AVG, dan lainnya) atau tabel pivot.



Seperti yang Anda lihat dari gambar di atas, jumlah transaksi dan transaksi unik berbeda.

Ini menunjukkan bahwa ada 2 transaksi di tabel kami yang memiliki transactionId duplikat:







Oleh karena itu, jika Anda tertarik dengan transaksi unik, gunakan fungsi yang menghitung baris unik. Alternatifnya, Anda dapat mengelompokkan data menggunakan klausa GROUP BY untuk menghilangkan duplikat sebelum menggunakan fungsi agregasi.



Fungsi untuk bekerja dengan tanggal (fungsi Tanggal)



Fungsi-fungsi ini memungkinkan Anda untuk memproses tanggal: mengubah formatnya, memilih bagian yang diperlukan (hari, bulan atau tahun), menggeser tanggal dengan interval tertentu.



Mereka dapat berguna bagi Anda dalam kasus berikut:



  • Saat menyiapkan analitik ujung ke ujung - untuk membawa tanggal dan waktu dari sumber yang berbeda ke satu format.
  • Saat membuat laporan yang diperbarui secara otomatis atau memicu surat. Misalnya, saat Anda membutuhkan data selama 2 jam terakhir, seminggu atau sebulan.
  • Saat membuat laporan kelompok, di mana diperlukan untuk mendapatkan data dalam konteks hari, minggu, bulan.


Fungsi tanggal yang paling umum digunakan:



SQL lama SQL standar Apa fungsinya
TANGGAL SEKARANG () TANGGAL SEKARANG () Mengembalikan tanggal saat ini dalam format% YYYY-% MM-% DD
DATE (stempel waktu) DATE (stempel waktu) Mengonversi tanggal dari format% YYYY-% MM-% DD% H:% M:% S. dalam format% YYYY-% MM-% DD
DATE_ADD (stempel waktu, interval, interval_unit) DATE_ADD(timestamp, INTERVAL interval interval_units) timestamp, interval.interval_units.



Legacy SQL YEAR, MONTH, DAY, HOUR, MINUTE SECOND, Standard SQL โ€” YEAR, QUARTER, MONTH, WEEK, DAY

DATE_ADD(timestamp, โ€” interval, interval_units) DATE_SUB(timestamp, INTERVAL interval interval_units) timestamp, interval
DATEDIFF(timestamp1, timestamp2) DATE_DIFF(timestamp1, timestamp2, date_part) timestamp1 timestamp2.

Legacy SQL , Standard SQL โ€” date_part (, , , , )
DAY(timestamp) EXTRACT(DAY FROM timestamp) timestamp. 1 31
MONTH(timestamp) EXTRACT(MONTH FROM timestamp) timestamp. 1 12
YEAR(timestamp) EXTRACT(YEAR FROM timestamp) timestamp


Untuk daftar semua fitur, lihat Bantuan SQL Lama dan SQL Standar .



Mari kita lihat demo data bagaimana masing-masing fungsi di atas bekerja. Misalnya, kita mendapatkan tanggal sekarang, bawa tanggal dari tabel asli ke dalam format% YYYY-% MM-% DD, kurangi dan tambahkan satu hari ke dalamnya. Kemudian kami menghitung perbedaan antara tanggal saat ini dan tanggal dari tabel asli dan membagi tanggal saat ini secara terpisah menjadi tahun, bulan dan hari. Untuk melakukannya, Anda dapat menyalin contoh kueri di bawah ini dan mengganti nama proyek, kumpulan data, dan tabel data dengan milik Anda.



#legal SQL



SELECT
    CURRENT_DATE() AS today,
    DATE( date_UTC ) AS date_UTC_in_YYYYMMDD,
    DATE_ADD( date_UTC,1, 'DAY') AS date_UTC_plus_one_day,
    DATE_ADD( date_UTC,-1, 'DAY') AS date_UTC_minus_one_day,
    DATEDIFF(CURRENT_DATE(), date_UTC ) AS difference_between_date,
    DAY( CURRENT_DATE() ) AS the_day,
    MONTH( CURRENT_DATE()) AS the_month,
    YEAR( CURRENT_DATE()) AS the_year
  FROM
    [owox-analytics:t_kravchenko.Demo_data]


#standar SQL



SELECT
  today,
  date_UTC_in_YYYYMMDD,
  DATE_ADD( date_UTC_in_YYYYMMDD, INTERVAL 1 DAY) AS date_UTC_plus_one_day,
  DATE_SUB( date_UTC_in_YYYYMMDD,INTERVAL 1 DAY) AS date_UTC_minus_one_day,
  DATE_DIFF(today, date_UTC_in_YYYYMMDD, DAY) AS difference_between_date,
  EXTRACT(DAY FROM today ) AS the_day,
  EXTRACT(MONTH FROM today ) AS the_month,
  EXTRACT(YEAR FROM today ) AS the_year
FROM (
  SELECT
    CURRENT_DATE() AS today,
    DATE( date_UTC ) AS date_UTC_in_YYYYMMDD
  FROM
    `owox-analytics.t_kravchenko.Demo_data`)


Setelah mengajukan permintaan, Anda akan menerima laporan berikut:







Fungsi untuk bekerja dengan string (Fungsi string)



Fungsi string memungkinkan Anda untuk membentuk string, memilih dan mengganti substring, menghitung panjang string dan indeks ordinal substring dalam string asli.



Misalnya, dengan bantuan mereka Anda dapat:



  • Buat filter dalam laporan oleh tag UTM yang diteruskan ke URL halaman.
  • Bawa data ke format yang seragam jika nama sumber dan kampanye ditulis dalam register yang berbeda.
  • Ganti data yang salah di laporan, misalnya, jika nama kampanye dikirim dengan kesalahan ketik.


Fungsi paling populer untuk bekerja dengan string:

SQL lama SQL standar Apa fungsinya
CONCAT ('str1', 'str2') atau 'str1' + 'str2' CONCAT ('str1', 'str2') Menggabungkan beberapa string 'str1' dan 'str2' menjadi satu
'str1' CONTAINS 'str2' REGEXP_CONTAINS('str1', 'str2') 'str1' LIKE โ€˜%str2%โ€™ true 'str1' โ€˜str2โ€™.

Standard SQL โ€˜str2โ€™ re2
LENGTH('str' ) CHAR_LENGTH('str' )

CHARACTER_LENGTH('str' )
'str' ( )
SUBSTR('str', index [, max_len]) SUBSTR('str', index [, max_len]) max_len, index 'str'
LOWER('str') LOWER('str') 'str'
UPPER(str) UPPER(str) 'str'
INSTR('str1', 'str2') STRPOS('str1', 'str2') Mengembalikan indeks kemunculan pertama string 'str2' dalam string 'str1', jika tidak - 0
REPLACE ('str1', 'str2', 'str3') REPLACE ('str1', 'str2', 'str3') Mengganti dalam string 'str1' substring 'str2' dengan substring 'str3'


Detail selengkapnya - di bantuan: SQL Lama dan SQL Standar .



Mari kita menganalisis bagaimana menggunakan fungsi yang dijelaskan menggunakan contoh data demo. Misalkan kita memiliki 3 kolom terpisah yang berisi nilai hari, bulan dan tahun:



Bekerja dengan tanggal dalam format ini sangat tidak nyaman, jadi kita akan menggabungkannya menjadi satu kolom. Untuk melakukannya, gunakan kueri SQL di bawah ini, dan jangan lupa untuk menyertakan nama proyek, kumpulan data, dan tabel Google BigQuery Anda.



#legal SQL



SELECT
  CONCAT(the_day,'-',the_month,'-',the_year) AS mix_string1,
  the_day+'-'+the_month+'-'+the_year AS mix_string2
FROM (
  SELECT
    '31' AS the_day,
    '12' AS the_month,
    '2018' AS the_year
  FROM
    [owox-analytics:t_kravchenko.Demo_data])
GROUP BY
  mix_string1,
  mix_string2


#standar SQL



SELECT
  CONCAT(the_day,'-',the_month,'-',the_year) AS mix_string1
FROM (
  SELECT
    '31' AS the_day,
    '12' AS the_month,
    '2018' AS the_year
  FROM
    `owox-analytics.t_kravchenko.Demo_data`)
GROUP BY
  mix_string1


Setelah menjalankan permintaan, kami akan menerima tanggal dalam satu kolom:







Seringkali, saat memuat halaman tertentu di situs, URL berisi nilai variabel yang telah dipilih pengguna. Ini bisa berupa metode pembayaran atau pengiriman, nomor transaksi, indeks toko fisik tempat pelanggan ingin mengambil item, dll. Dengan menggunakan kueri SQL, Anda dapat mengekstrak parameter ini dari alamat halaman.



Mari kita lihat dua contoh tentang bagaimana dan mengapa melakukan ini.



Contoh 1 . Katakanlah kita ingin mengetahui jumlah pembelian di mana pengguna mengambil item dari toko fisik. Untuk melakukan ini, Anda perlu menghitung jumlah transaksi yang dikirim dari halaman yang URL-nya berisi substring shop_id (indeks toko fisik). Kami melakukan ini menggunakan kueri berikut:



#legasy SQL



SELECT
  COUNT(transactionId) AS transactions,
  check
FROM (
  SELECT
    transactionId,
    page CONTAINS 'shop_id' AS check
  FROM
    [owox-analytics:t_kravchenko.Demo_data])
GROUP BY
  check


#standar SQL

SELECT
  COUNT(transactionId) AS transactions,
  check1,
  check2
FROM (
  SELECT
    transactionId,
    REGEXP_CONTAINS( page, 'shop_id') AS check1,
    page LIKE '%shop_id%' AS check2
  FROM
    `owox-analytics.t_kravchenko.Demo_data`)
GROUP BY
  check1,
  check2


Dari tabel yang dihasilkan, kita melihat bahwa 5502 transaksi dikirim dari halaman yang berisi shop_id (check = true):







Contoh 2 . Misalkan Anda menetapkan delivery_id Anda ke setiap metode pengiriman dan menulis nilai parameter ini di URL halaman. Untuk mengetahui metode pengiriman mana yang telah dipilih pengguna, pilih delivery_id di kolom terpisah.

Kami menggunakan kueri berikut untuk ini:



#legasy SQL



SELECT
  page_lower_case,
  page_length,
  index_of_delivery_id,
  selected_delivery_id,
  REPLACE(selected_delivery_id, 'selected_delivery_id=', '') as delivery_id
FROM (
  SELECT
    page_lower_case,
    page_length,
    index_of_delivery_id,
    SUBSTR(page_lower_case, index_of_delivery_id) AS selected_delivery_id
  FROM (
    SELECT
      page_lower_case,
      LENGTH(page_lower_case) AS page_length,
      INSTR(page_lower_case, 'selected_delivery_id') AS index_of_delivery_id
    FROM (
      SELECT
        LOWER( page) AS page_lower_case,
        UPPER( page) AS page_upper_case
      FROM
        [owox-analytics:t_kravchenko.Demo_data])))
ORDER BY
  page_lower_case ASC


#standar SQL



SELECT
  page_lower_case,
  page_length,
  index_of_delivery_id,
  selected_delivery_id,
  REPLACE(selected_delivery_id, 'selected_delivery_id=', '') AS delivery_id
FROM (
  SELECT
    page_lower_case,
    page_length,
    index_of_delivery_id,
    SUBSTR(page_lower_case, index_of_delivery_id) AS selected_delivery_id
  FROM (
    SELECT
      page_lower_case,
      CHAR_LENGTH(page_lower_case) AS page_length,
      STRPOS(page_lower_case, 'selected_delivery_id') AS index_of_delivery_id
    FROM (
      SELECT
        LOWER( page) AS page_lower_case,
        UPPER( page) AS page_upper_case
      FROM
        `owox-analytics.t_kravchenko.Demo_data`)))
ORDER BY
  page_lower_case ASC


Hasilnya, kami mendapatkan tabel berikut di Google BigQuery:







Fungsi untuk bekerja dengan subset data atau fungsi jendela (fungsi Window)



Fungsi-fungsi ini mirip dengan fungsi agregasi yang kita bahas di atas. Perbedaan utamanya adalah bahwa penghitungan dilakukan tidak pada seluruh kumpulan data yang dipilih menggunakan kueri, tetapi pada sebagian darinya - subset atau jendela.



Dengan menggunakan fungsi jendela, Anda dapat menggabungkan data berdasarkan grup tanpa menggunakan operator JOIN untuk menggabungkan beberapa kueri. Misalnya, hitung pendapatan rata-rata dengan kampanye iklan, jumlah transaksi berdasarkan perangkat. Dengan menambahkan kolom lain ke laporan, Anda dapat dengan mudah mengetahui, misalnya, bagian pendapatan dari kampanye iklan di Black Friday atau bagian transaksi yang dilakukan dari aplikasi seluler.



Bersama dengan setiap fungsi, ekspresi OVER harus ditulis dalam permintaan, yang mendefinisikan batas jendela. OVER berisi 3 komponen yang dapat Anda kerjakan:



  • PARTITION BY - menentukan atribut yang akan digunakan untuk membagi data sumber menjadi beberapa subset, misalnya PARTITION BY clientId, DayTime.
  • ORDER BY - menentukan urutan baris dalam subset, misalnya ORDER BY DESC jam.
  • BINGKAI JENDELA - memungkinkan Anda untuk memproses baris dalam subset sesuai dengan karakteristik tertentu. Misalnya, Anda dapat menghitung jumlah tidak semua baris di jendela, tetapi hanya lima baris pertama sebelum baris saat ini.


Tabel ini merangkum fungsi jendela yang paling umum digunakan:

SQL lama SQL standar Apa fungsinya
AVG (bidang)

JUMLAH (bidang)

JUMLAH (bidang berbeda)

MAX ()

MIN ()

SUM ()

AVG ([DISTINCT] (field))

COUNT (field)

COUNT ([DISTINCT] (field))

MAX (field)

MIN (field)

SUM (field)

, , , field .



DISTINCT , ()

'str1' CONTAINS 'str2' REGEXP_CONTAINS('str1', 'str2') 'str1' LIKE โ€˜%str2%โ€™ true 'str1' โ€˜str2โ€™.

Standard SQL โ€˜str2โ€™ re2
DENSE_RANK() DENSE_RANK()
FIRST_VALUE(field) FIRST_VALUE (field[{RESPECT | IGNORE} NULLS]) field .



field . RESPECT IGNORE NULLS , NULL

LAST_VALUE(field) LAST_VALUE (field [{RESPECT | IGNORE} NULLS]) field .



field . RESPECT IGNORE NULLS , NULL

LAG(field) LAG (field[, offset [, default_expression]]) field .



Offset , . .



Default_expression โ€” , ,

LEAD(field) LEAD (field[, offset [, default_expression]]) field .



Offset , . .



Default_expression โ€” , ,



Anda dapat melihat daftar semua fungsi di Help for Legacy SQL dan Standard SQL: Aggregate Analytic Functions , Navigation Functions .



Contoh 1. Misalkan kita ingin menganalisis aktivitas pelanggan selama jam kerja dan non-jam kerja. Untuk melakukan ini, perlu untuk membagi transaksi menjadi 2 grup dan menghitung metrik yang kami minati:



  • Grup 1 - pembelian selama jam kerja 9: 00-18: 00.
  • Kelompok 2 - pembelian di luar jam kerja dari 00:00 sampai 9:00 dan dari 18:00 sampai 00:00.


Selain jam kerja dan bukan jam kerja, tanda lain untuk pembentukan jendela adalah clientId, yaitu untuk setiap pengguna kita akan memiliki dua jendela:

Subset (jendela) clientId Siang hari
1 jendela clientId 1 Waktu kerja
2 jendela clientId 2 Non-jam kerja
3 jendela clientId 3 Waktu kerja
4 jendela clientId 4 Non-jam kerja
Jendela N. clientId N Waktu kerja
Jendela N + 1 clientId N + 1 Non-jam kerja


Mari kita hitung pendapatan rata-rata, maksimum, minimum, dan total, jumlah transaksi dan jumlah transaksi unik untuk setiap pengguna selama jam kerja dan non-kerja pada data demo. Pertanyaan di bawah ini akan membantu kami melakukan ini.



#legal SQL



SELECT
  date,
  clientId,
  DayTime,
  avg_revenue,
  max_revenue,
  min_revenue,
  sum_revenue,
  transactions,
  unique_transactions
FROM (
  SELECT
    date,
    clientId,
    DayTime,
    AVG(revenue) OVER (PARTITION BY date, clientId, DayTime) AS avg_revenue,
    MAX(revenue) OVER (PARTITION BY date, clientId, DayTime) AS max_revenue,
    MIN(revenue) OVER (PARTITION BY date, clientId, DayTime) AS min_revenue,
    SUM(revenue) OVER (PARTITION BY date, clientId, DayTime) AS sum_revenue,
    COUNT(transactionId) OVER (PARTITION BY date, clientId, DayTime) AS transactions,
    COUNT(DISTINCT(transactionId)) OVER (PARTITION BY date, clientId, DayTime) AS unique_transactions
  FROM (
    SELECT
      date,
      date_UTC,
      clientId,
      transactionId,
      revenue,
      page,
      hour,
      CASE
        WHEN hour>=9 AND hour<=18 THEN ' '
        ELSE ' '
      END AS DayTime
    FROM
      [owox-analytics:t_kravchenko.Demo_data]))
GROUP BY
  date,
  clientId,
  DayTime,
  avg_revenue,
  max_revenue,
  min_revenue,
  sum_revenue,
  transactions,
  unique_transactions
ORDER BY
  transactions DESC


#standar SQL



SELECT
  date,
  clientId,
  DayTime,
  avg_revenue,
  max_revenue,
  min_revenue,
  sum_revenue,
  transactions,
  unique_transactions
FROM (
  SELECT
    date,
    clientId,
    DayTime,
    AVG(revenue) OVER (PARTITION BY date, clientId, DayTime) AS avg_revenue,
    MAX(revenue) OVER (PARTITION BY date, clientId, DayTime) AS max_revenue,
    MIN(revenue) OVER (PARTITION BY date, clientId, DayTime) AS min_revenue,
    SUM(revenue) OVER (PARTITION BY date, clientId, DayTime) AS sum_revenue,
    COUNT(transactionId) OVER (PARTITION BY date, clientId, DayTime) AS transactions,
    COUNT(DISTINCT(transactionId)) OVER (PARTITION BY date, clientId, DayTime) AS unique_transactions
  FROM (
    SELECT
      date,
      date_UTC,
      clientId,
      transactionId,
      revenue,
      page,
      hour,
      CASE
        WHEN hour>=9 AND hour<=18 THEN ' '
        ELSE ' '
      END AS DayTime
    FROM
      `owox-analytics.t_kravchenko.Demo_data`))
GROUP BY
  date,
  clientId,
  DayTime,
  avg_revenue,
  max_revenue,
  min_revenue,
  sum_revenue,
  transactions,
  unique_transactions
ORDER BY
  transactions DESC


Mari kita lihat apa yang terjadi sebagai hasilnya, menggunakan contoh dari salah satu pengguna dengan clientId = '102041117.1428132012 โ€ฒ. Di tabel awal untuk pengguna ini, kami memiliki data berikut:







Dengan menerapkan kueri, kami menerima laporan yang berisi pendapatan rata-rata, minimum, maksimum dan total dari pengguna ini, serta jumlah transaksi. Seperti yang Anda lihat pada tangkapan layar di bawah ini, pengguna melakukan kedua transaksi selama jam kerja:





Contoh 2 . Sekarang mari kita sedikit memperumit tugas:



  • Mari kita letakkan nomor seri untuk semua transaksi di jendela, tergantung pada waktu pelaksanaannya. Ingatlah bahwa kita mendefinisikan jendela berdasarkan pengguna dan waktu kerja / non-kerja.
  • Mari kita tampilkan pendapatan dari transaksi berikutnya / sebelumnya (relatif terhadap transaksi saat ini) di dalam jendela.
  • Mari kita tampilkan pendapatan dari transaksi pertama dan terakhir di jendela.


Untuk ini kami menggunakan kueri berikut:



#legasy SQL



SELECT
  date,
  clientId,
  DayTime,
  hour,
  rank,
  revenue,
  lead_revenue,
  lag_revenue,
  first_revenue_by_hour,
  last_revenue_by_hour
FROM (
  SELECT
    date,
    clientId,
    DayTime,
    hour,
    DENSE_RANK() OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS rank,
    revenue,
    LEAD( revenue, 1) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS lead_revenue,
    LAG( revenue, 1) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS lag_revenue,
    FIRST_VALUE(revenue) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS first_revenue_by_hour,
    LAST_VALUE(revenue) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS last_revenue_by_hour
  FROM (
    SELECT
      date,
      date_UTC,
      clientId,
      transactionId,
      revenue,
      page,
      hour,
      CASE
        WHEN hour>=9 AND hour<=18 THEN ' '
        ELSE ' '
      END AS DayTime
    FROM
      [owox-analytics:t_kravchenko.Demo_data]))
GROUP BY
  date,
  clientId,
  DayTime,
  hour,
  rank,
  revenue,
  lead_revenue,
  lag_revenue,
  first_revenue_by_hour,
  last_revenue_by_hour
ORDER BY
  date,
  clientId,
  DayTime,
  hour,
  rank,
  revenue,
  lead_revenue,
  lag_revenue,
  first_revenue_by_hour,
  last_revenue_by_hour


#standar SQL



SELECT
  date,
  clientId,
  DayTime,
  hour,
  rank,
  revenue,
  lead_revenue,
  lag_revenue,
  first_revenue_by_hour,
  last_revenue_by_hour
FROM (
  SELECT
    date,
    clientId,
    DayTime,
    hour,
    DENSE_RANK() OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS rank,
    revenue,
    LEAD( revenue, 1) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS lead_revenue,
    LAG( revenue, 1) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS lag_revenue,
    FIRST_VALUE(revenue) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS first_revenue_by_hour,
    LAST_VALUE(revenue) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS last_revenue_by_hour
  FROM (
    SELECT
      date,
      date_UTC,
      clientId,
      transactionId,
      revenue,
      page,
      hour,
      CASE
        WHEN hour>=9 AND hour<=18 THEN ' '
        ELSE ' '
      END AS DayTime
    FROM
      `owox-analytics.t_kravchenko.Demo_data`))
GROUP BY
  date,
  clientId,
  DayTime,
  hour,
  rank,
  revenue,
  lead_revenue,
  lag_revenue,
  first_revenue_by_hour,
  last_revenue_by_hour
ORDER BY
  date,
  clientId,
  DayTime,
  hour,
  rank,
  revenue,
  lead_revenue,
  lag_revenue,
  first_revenue_by_hour,
  last_revenue_by_hour


Mari kita periksa hasil perhitungan menggunakan contoh pengguna yang sudah akrab dengan kita dengan clientId = '102041117.1428132012 โ€ฒ:







Dari tangkapan layar di atas, kita melihat bahwa:



  • Transaksi pertama pada pukul 15.00 dan transaksi kedua pada pukul 16.00.
  • Setelah transaksi berjalan pada pukul 15.00, terjadi transaksi pada pukul 16.00, yang penghasilannya 25066 (kolom lead_revenue).
  • Sebelum transaksi saat ini pada pukul 16:00, ada transaksi pada pukul 15:00 dengan pendapatan 3699 (kolom lag_revenue).
  • Transaksi pertama dalam jendela adalah transaksi pada pukul 15:00, dengan pendapatan 3699 (kolom first_revenue_by_hour).
  • Permintaan memproses data baris demi baris, oleh karena itu, untuk transaksi yang dimaksud, itu akan menjadi yang terakhir di jendela dan nilai di kolom last_revenue_by_hour dan pendapatan akan sama.


kesimpulan



Pada artikel ini, kita telah membahas fungsi paling populer dari bagian Fungsi agregat, fungsi Tanggal, fungsi String, fungsi Window. Namun, Google BigQuery memiliki lebih banyak fitur berguna, misalnya:



  • Fungsi transmisi - memungkinkan Anda mentransmisikan data ke format tertentu.
  • Fungsi kartu bebas tabel - memungkinkan Anda mengakses beberapa tabel dari kumpulan data.
  • Fungsi ekspresi reguler - memungkinkan Anda mendeskripsikan model kueri penelusuran, dan bukan nilai tepatnya.


Tulis di komentar jika masuk akal untuk menulis dengan detail yang sama tentang mereka.



All Articles