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:
- Di antarmuka BigQuery, di jendela pengeditan kueri, pilih "Tampilkan Opsi" dan hapus centang pada kotak di samping opsi "Gunakan SQL Lama"
- 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.