Sintaksis, Fungsi, dan Operator SQL Lama
Dokumen ini menjelaskan sintaksis, fungsi, dan operator kueri SQL lama. Sintaksis kueri yang lebih disukai untuk BigQuery adalah GoogleSQL. Untuk informasi tentang GoogleSQL, lihat Sintaksis kueri GoogleSQL.
Sintaksis kueri
Catatan: Kata kunci tidak peka huruf besar/kecil. Dalam dokumen ini, kata kunci seperti SELECT
menggunakan huruf besar sebagai ilustrasi saja.
Klausa SELECT
Klausa SELECT
menentukan daftar ekspresi yang akan dihitung. Ekspresi dalam klausa SELECT
dapat berisi nama kolom, literal, dan panggilan fungsi (termasuk fungsi agregat dan fungsi jendela) serta kombinasi dari ketiganya. Daftar ekspresi dipisahkan koma.
Setiap ekspresi dapat diberi alias dengan menambahkan spasi yang diikuti dengan ID setelah ekspresi. Kata kunci AS
opsional dapat ditambahkan antara ekspresi dan alias agar lebih mudah dibaca. Alias yang ditentukan dalam klausa SELECT
dapat direferensikan dalam klausa GROUP BY
, HAVING
, dan ORDER BY
pada kueri, tetapi tidak oleh klausa FROM
, WHERE
, atau OMIT RECORD IF
, atau oleh ekspresi lain dalam klausa SELECT
yang sama.
Catatan:
-
Jika Anda menggunakan fungsi agregat dalam klausa
SELECT
, Anda harus menggunakan fungsi agregat di semua ekspresi atau kueri Anda harus memiliki klausaGROUP BY
yang menyertakan semua kolom non-agregat di klausaSELECT
sebagai kunci pengelompokan. Contoh:#legacySQL SELECT word, corpus, COUNT(word) FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th" GROUP BY word, corpus; /* Succeeds because all non-aggregated fields are group keys. */
#legacySQL SELECT word, corpus, COUNT(word) FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th" GROUP BY word; /* Fails because corpus is not aggregated nor is it a group key. */
-
Anda dapat menggunakan tanda kurung siku untuk meng-escape kata yang dicadangkan sehingga Anda dapat menggunakannya sebagai nama kolom dan alias. Misalnya, jika Anda memiliki kolom bernama "partition", yang merupakan kata khusus untuk sistem dalam sintaksis BigQuery, kueri yang mereferensikan ke kolom tersebut akan gagal dengan pesan error yang tidak jelas, kecuali jika Anda meng-escape kolom itu dengan tanda kurung siku:
SELECT [partition] FROM ...
Contoh
Contoh ini menentukan alias dalam klausa SELECT
, lalu mereferensikan salah satunya dalam klausa ORDER BY
. Perhatikan bahwa kolom word tidak dapat direferensikan menggunakan word_alias dalam klausa WHERE
; kolom itu harus direferensikan dengan nama. Alias len juga tidak terlihat dalam klausa WHERE
. Alias tersebut akan terlihat dalam klausa HAVING
.
#legacySQL SELECT word AS word_alias, LENGTH(word) AS len FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS 'th' ORDER BY len;
Pengubah WITHIN untuk fungsi agregat
aggregate_function WITHIN RECORD [ [ AS ] alias ]
Kata kunci WITHIN
menyebabkan fungsi agregat menggabungkan seluruh nilai berulang dalam setiap kumpulan data. Untuk setiap kumpulan data input, hanya satu output gabungan yang akan dihasilkan. Jenis agregasi ini disebut sebagai agregasi cakupan. Karena agregasi cakupan menghasilkan output untuk setiap kumpulan data, ekspresi non-gabungan dapat dipilih bersama dengan ekspresi agregasi cakupan tanpa menggunakan klausa GROUP BY
.
Biasanya Anda akan menggunakan cakupan RECORD
saat menggunakan agregasi cakupan. Jika memiliki skema berulang dan bertingkat yang sangat kompleks, Anda mungkin perlu melakukan agregasi dalam cakupan sub-data. Hal ini dapat dilakukan dengan mengganti kata kunci RECORD
dalam sintaksis di atas dengan nama node dalam skema tempat Anda ingin agregasi dilakukan.
Untuk mengetahui informasi selengkapnya tentang perilaku lanjutan tersebut, lihat Menangani data.
Contoh
Contoh ini melakukan agregasi COUNT
yang tercakup, lalu memfilter dan mengurutkan kumpulan data berdasarkan nilai gabungan.
#legacySQL SELECT repository.url, COUNT(payload.pages.page_name) WITHIN RECORD AS page_count FROM [bigquery-public-data:samples.github_nested] HAVING page_count > 80 ORDER BY page_count DESC;
Klausa FROM
FROM [project_name:]datasetId.tableId [ [ AS ] alias ] | (subquery) [ [ AS ] alias ] |JOIN
clause |FLATTEN
clause | table wildcard function
Klausa FROM
menentukan data sumber yang akan dikueri. Kueri BigQuery dapat dijalankan langsung melalui tabel, subkueri, tabel gabungan, dan tabel yang dimodifikasi oleh operator dengan tujuan khusus seperti yang dijelaskan di bawah ini. Kombinasi sumber data ini dapat dikueri menggunakan koma, yang merupakan operator UNION ALL
di BigQuery.
Mereferensikan tabel
Saat mereferensikan tabel, datasetId dan tableId harus ditentukan; project_name bersifat opsional. Jika project_name tidak ditentukan, BigQuery akan menetapkannya secara default ke project saat ini. Jika nama project Anda menyertakan tanda hubung, Anda harus mengapit seluruh referensi tabel dengan tanda kurung siku.
Contoh
[my-dashed-project:dataset1.tableName]
Tabel dapat diberi alias dengan menambahkan spasi diikuti dengan ID setelah nama tabel. Kata kunci AS
opsional dapat ditambahkan antara tableId dan alias agar lebih mudah dibaca.
Saat mereferensikan kolom dari tabel, Anda dapat menggunakan nama kolom sederhana atau memberikan awalan pada nama kolom dengan alias, jika Anda menentukannya, atau dengan datasetId dan tableId selama tidak ada project_name yang ditentukan. project_name tidak dapat disertakan dalam awalan kolom karena karakter titik dua tidak diizinkan dalam nama kolom.
Contoh
Contoh ini mereferensikan kolom tanpa awalan tabel.
#legacySQL SELECT word FROM [bigquery-public-data:samples.shakespeare];
Contoh ini memberi awalan pada nama kolom dengan datasetId dan tableId. Perhatikan bahwa project_name tidak dapat disertakan dalam contoh ini. Metode ini hanya akan berfungsi jika set data berada dalam project default Anda saat ini.
#legacySQL SELECT samples.shakespeare.word FROM samples.shakespeare;
Contoh ini memberi awalan pada nama kolom dengan alias tabel.
#legacySQL SELECT t.word FROM [bigquery-public-data:samples.shakespeare] AS t;
Tabel berpartisi berdasarkan rentang bilangan bulat
SQL lama mendukung penggunaan dekorator tabel untuk menangani partisi tertentu dalam tabel berpartisi berdasarkan rentang bilangan bulat. Kunci untuk menangani partisi rentang adalah awal dari rentang.
Contoh berikut mengkueri partisi rentang yang dimulai dengan 30:
#legacySQL SELECT * FROM dataset.table$30;
Perhatikan bahwa Anda tidak dapat menggunakan SQL lama untuk membuat kueri di seluruh tabel berpartisi berdasarkan rentang bilangan bulat. Sebagai gantinya, kueri akan menampilkan error seperti berikut:
Querying tables partitioned on a field is not supported in Legacy SQL
Menggunakan subkueri
Subkueri adalah pernyataan SELECT
bertingkat yang digabungkan dalam tanda kurung. Ekspresi yang dihitung dalam klausa SELECT
pada subkueri tersedia untuk kueri outer, sama seperti kolom tabel yang akan tersedia.
Subkueri dapat digunakan untuk menghitung agregasi dan ekspresi lainnya. Berbagai operator SQL tersedia di subkueri. Artinya, subkueri itu sendiri dapat berisi subkueri lain, subkueri dapat melakukan penggabungan dan mengelompokkan agregasi, dll.
Koma sebagai UNION ALL
Tidak seperti GoogleSQL, legacy SQL menggunakan koma sebagai operator UNION ALL
, bukan operator CROSS JOIN
. Ini adalah perilaku lama yang berkembang karena selama ini BigQuery tidak mendukung CROSS JOIN
, dan pengguna BigQuery harus menulis kueri UNION ALL
secara rutin. Di GoogleSQL, kueri yang menjalankan penggabungan biasanya sangat panjang. Penggunaan koma sebagai operator gabungan memungkinkan penulisan kueri semacam itu menjadi jauh lebih efisien. Misalnya, kueri ini dapat digunakan untuk menjalankan satu kueri terhadap log dari beberapa hari.
#legacySQL SELECT FORMAT_UTC_USEC(event.timestamp_in_usec) AS time, request_url FROM [applogs.events_20120501], [applogs.events_20120502], [applogs.events_20120503] WHERE event.username = 'root' AND NOT event.source_ip.is_internal;
Kueri yang menggabungkan sejumlah besar tabel biasanya berjalan lebih lambat daripada kueri yang memproses jumlah data yang sama dari satu tabel. Perbedaan performa dapat mencapai 50 md per tabel tambahan. Satu kueri dapat menggabungkan maksimal 1.000 tabel.
Fungsi karakter pengganti tabel
Istilah fungsi karakter pengganti tabel merujuk pada jenis fungsi khusus yang unik untuk BigQuery.
Fungsi ini digunakan dalam klausa FROM
untuk mencocokkan kumpulan nama tabel menggunakan salah satu dari beberapa jenis filter. Misalnya, fungsi TABLE_DATE_RANGE
hanya dapat digunakan untuk membuat kueri terhadap kumpulan tabel harian tertentu. Untuk mengetahui informasi selengkapnya tentang fungsi ini, lihat Fungsi karakter pengganti tabel.
Operator FLATTEN
(FLATTEN([project_name:]datasetId.tableId, field_to_be_flattened)) (FLATTEN((subquery), field_to_be_flattened))
Tidak seperti sistem pemrosesan SQL biasa, BigQuery dirancang untuk menangani data berulang. Karena itu, pengguna BigQuery terkadang perlu menulis kueri yang memanipulasi struktur kumpulan data berulang. Salah satu cara untuk melakukannya adalah menggunakan operator FLATTEN
.
FLATTEN
mengonversi satu node dalam skema dari berulang menjadi opsional. Dengan mempertimbangkan kumpulan data dengan satu atau beberapa nilai untuk kolom berulang, FLATTEN
akan membuat beberapa kumpulan data, satu untuk setiap nilai di kolom berulang. Semua kolom lain yang dipilih dari kumpulan data akan diduplikasi di setiap kumpulan data output baru. FLATTEN
dapat diterapkan berulang kali untuk menghapus beberapa tingkat pengulangan.
Untuk mengetahui informasi dan contoh selengkapnya, lihat Menangani data.
Operator JOIN
BigQuery mendukung beberapa operator JOIN
di setiap klausa FROM
.
Operasi JOIN
berikutnya menggunakan hasil dari operasi JOIN
sebelumnya sebagai input JOIN
kiri. Kolom dari input JOIN
sebelumnya dapat digunakan sebagai kunci dalam klausa ON
dari operator JOIN
berikutnya.
Jenis JOIN
BigQuery mendukung operasi INNER
, [FULL|RIGHT|LEFT] OUTER
, dan CROSS JOIN
. Jika tidak ditentukan, defaultnya adalah INNER
.
Operasi CROSS JOIN
tidak mengizinkan klausa ON
. CROSS JOIN
dapat menampilkan data dalam jumlah besar serta dapat menghasilkan kueri yang lambat dan tidak efisien, atau kueri yang melebihi resource per kueri maksimum yang diizinkan. Kueri tersebut akan gagal dengan pesan error. Jika memungkinkan, pilih kueri yang tidak menggunakan CROSS JOIN
. Misalnya, CROSS JOIN
sering digunakan di berbagai tempat fungsi jendela akan lebih efisien.
Pengubah EACH
Pengubah EACH
adalah petunjuk yang memberi tahu BigQuery untuk menjalankan JOIN
menggunakan beberapa partisi. Hal ini sangat berguna jika Anda mengetahui bahwa kedua sisi JOIN
berukuran besar. Pengubah EACH
tidak dapat digunakan dalam klausa CROSS JOIN
.
Penggunaan EACH
sebelumnya disarankan dalam banyak kasus, tetapi sekarang tidak lagi. Jika memungkinkan, gunakan JOIN
tanpa pengubah EACH
untuk mendapatkan performa yang lebih baik.
Gunakan JOIN EACH
saat kueri Anda gagal dengan pesan error yang menyatakan bahwa resource terlampaui.
Semi-join dan Anti-join
Selain mendukung JOIN
dalam klausa FROM
, BigQuery juga mendukung dua jenis join dalam klausa WHERE
: semi-join dan anti-semi-join. Semi-join ditentukan menggunakan kata kunci IN
dengan subkueri; anti-join ditentukan menggunakan kata kunci NOT IN
.
Contoh
Kueri berikut menggunakan semi-join untuk menemukan n-gram dengan kata pertama dalam n-gram juga merupakan kata kedua dalam n-gram lain yang memiliki "AND" sebagai kata ketiga dalam n-gram.
#legacySQL SELECT ngram FROM [bigquery-public-data:samples.trigrams] WHERE first IN (SELECT second FROM [bigquery-public-data:samples.trigrams] WHERE third = "AND") LIMIT 10;
Kueri berikut menggunakan semi-join untuk menampilkan jumlah perempuan berusia di atas 50 tahun yang melahirkan di 10 negara bagian dengan kelahiran terbanyak.
#legacySQL SELECT mother_age, COUNT(mother_age) total FROM [bigquery-public-data:samples.natality] WHERE state IN (SELECT state FROM (SELECT state, COUNT(state) total FROM [bigquery-public-data:samples.natality] GROUP BY state ORDER BY total DESC LIMIT 10)) AND mother_age > 50 GROUP BY mother_age ORDER BY mother_age DESC
Guna melihat jumlah perempuan tersebut untuk 40 negara bagian lainnya, Anda dapat menggunakan anti-join. Kueri berikut hampir identik dengan contoh sebelumnya, tetapi menggunakan NOT IN
dan bukan IN
untuk menampilkan jumlah perempuan berusia di atas 50 tahun yang melahirkan di 40 negara bagian dengan angka kelahiran paling sedikit.
#legacySQL SELECT mother_age, COUNT(mother_age) total FROM [bigquery-public-data:samples.natality] WHERE state NOT IN (SELECT state FROM (SELECT state, COUNT(state) total FROM [bigquery-public-data:samples.natality] GROUP BY state ORDER BY total DESC LIMIT 10)) AND mother_age > 50 GROUP BY mother_age ORDER BY mother_age DESC
Catatan:
- BigQuery tidak mendukung semi-join atau anti-semi-join yang berkorelasi. Subkueri tidak dapat mereferensikan kolom apa pun dari kueri outer.
- Subkueri yang digunakan dalam semi-join atau anti-semi-join harus memilih satu kolom.
-
Jenis kolom yang dipilih dan kolom yang digunakan dari kueri outer dalam klausa
WHERE
harus sama persis. BigQuery tidak akan melakukan pemaksaan jenis apa pun untuk semi-join atau anti-semi-join.
Klausa WHERE
Klausa WHERE
, yang terkadang disebut predikat, memfilter kumpulan data yang dihasilkan oleh klausa FROM
menggunakan ekspresi boolean. Beberapa kondisi dapat digabungkan dengan klausa AND
dan OR
boolean, yang secara opsional diapit oleh tanda kurung—()— untuk mengelompokkannya. Kolom yang tercantum dalam klausa WHERE
tidak perlu dipilih dalam klausa SELECT
yang terkait dan ekspresi klausa WHERE
tidak dapat merujuk ke ekspresi yang dihitung dalam klausa SELECT
pada kueri yang memiliki klausa WHERE
.
Catatan: Fungsi agregat tidak dapat digunakan dalam klausa WHERE
. Gunakan klausa HAVING
dan kueri outer jika Anda perlu memfilter output fungsi agregat.
Contoh
Contoh berikut menggunakan disjungsi ekspresi boolean dalam klausa WHERE
— dua ekspresi yang digabungkan oleh operator OR
. Kumpulan data input akan diteruskan melalui filter WHERE
jika salah satu ekspresi menampilkan true
.
#legacySQL SELECT word FROM [bigquery-public-data:samples.shakespeare] WHERE (word CONTAINS 'prais' AND word CONTAINS 'ing') OR (word CONTAINS 'laugh' AND word CONTAINS 'ed');
Klausa OMIT RECORD IF
Klausa OMIT RECORD IF
adalah konstruksi yang unik untuk BigQuery. Klausa ini sangat berguna untuk menangani skema berulang yang bertingkat. Ini mirip dengan klausa WHERE
, tetapi berbeda karena dua hal penting. Pertama, metode ini menggunakan kondisi pengecualian, yang berarti bahwa kumpulan data dihilangkan jika ekspresi menampilkan true
, tetapi disimpan jika ekspresi menampilkan false
atau null
. Kedua, klausa OMIT RECORD IF
dapat (dan biasanya) menggunakan fungsi agregat cakupan dalam kondisinya.
Selain memfilter kumpulan data lengkap, OMIT...IF
dapat menentukan cakupan yang lebih sempit untuk memfilter sebagian data saja. Hal ini dilakukan dengan menggunakan nama node non-leaf di skema Anda, bukan RECORD
di klausa OMIT...IF
. Fungsi ini jarang digunakan oleh pengguna BigQuery. Anda dapat menemukan dokumentasi selengkapnya tentang perilaku lanjutan ini yang ditautkan dari dokumentasi WITHIN
di atas.
Jika Anda menggunakan OMIT...IF
untuk mengecualikan sebagian data dalam kolom berulang, dan kueri juga memilih kolom berulang secara independen lainnya, BigQuery akan menghilangkan sebagian dari kumpulan data berulang lainnya dalam kueri. Jika Anda melihat error Cannot perform OMIT IF on repeated scope <scope> with independently repeating pass through field <field>,
, sebaiknya beralih ke GoogleSQL. Untuk mengetahui informasi tentang cara memigrasikan pernyataan OMIT...IF
ke GoogleSQL, lihat Bermigrasi ke GoogleSQL.
Contoh
Mengacu kembali ke contoh yang digunakan untuk pengubah WITHIN
, OMIT RECORD IF
dapat digunakan untuk melakukan hal yang sama seperti yang digunakan WITHIN
dan HAVING
dalam contoh tersebut.
#legacySQL SELECT repository.url FROM [bigquery-public-data:samples.github_nested] OMIT RECORD IF COUNT(payload.pages.page_name) <= 80;
Klausa GROUP BY
Dengan klausa GROUP BY
, Anda dapat mengelompokkan baris yang memiliki nilai sama untuk kolom atau kumpulan kolom tertentu sehingga Anda dapat menghitung agregasi kolom terkait. Pengelompokan terjadi setelah pemfilteran yang dilakukan dalam klausa WHERE
, tetapi sebelum ekspresi dalam klausa SELECT
dihitung. Hasil ekspresi tidak dapat digunakan sebagai kunci grup dalam klausa GROUP BY
.
Contoh
Kueri ini menemukan sepuluh kata pertama teratas yang paling umum dalam set data sampel trigram.
Selain menunjukkan penggunaan klausa GROUP BY
, contoh ini juga menunjukkan bagaimana indeks posisi dapat digunakan sebagai ganti nama kolom dalam klausa GROUP BY
dan ORDER BY
.
#legacySQL SELECT first, COUNT(ngram) FROM [bigquery-public-data:samples.trigrams] GROUP BY 1 ORDER BY 2 DESC LIMIT 10;
Agregasi yang dilakukan menggunakan klausa GROUP BY
disebut agregasi yang dikelompokkan . Tidak seperti agregasi cakupan, agregasi yang dikelompokkan biasa terjadi di sebagian besar sistem pemrosesan SQL.
Pengubah EACH
Pengubah EACH
adalah petunjuk yang memberi tahu BigQuery untuk menjalankan GROUP BY
menggunakan beberapa partisi. Hal ini sangat berguna jika Anda tahu bahwa set data berisi sejumlah besar nilai yang berbeda untuk kunci grup.
Penggunaan EACH
sebelumnya disarankan dalam banyak kasus, tetapi sekarang tidak lagi.
Menggunakan GROUP BY
tanpa pengubah EACH
biasanya memberikan performa yang lebih baik.
Gunakan GROUP EACH BY
saat kueri Anda gagal dengan pesan error yang menyatakan bahwa resource terlampaui.
Fungsi ROLLUP
Saat fungsi ROLLUP
digunakan, BigQuery akan menambahkan baris tambahan ke hasil kueri yang merepresentasikan agregasi yang digabungkan. Semua kolom yang tercantum setelah ROLLUP
harus diapit dalam satu set tanda kurung. Dalam baris yang ditambahkan karena fungsi ROLLUP
, NULL
menunjukkan kolom yang agregasinya digabungkan.
Contoh
Kueri ini menghasilkan jumlah kelahiran laki-laki dan perempuan per tahun dari sampel set data kelahiran.
#legacySQL SELECT year, is_male, COUNT(1) as count FROM [bigquery-public-data:samples.natality] WHERE year >= 2000 AND year <= 2002 GROUP BY ROLLUP(year, is_male) ORDER BY year, is_male;
Ini hasil kuerinya. Perhatikan bahwa ada baris yang salah satu atau kedua kunci grupnya adalah NULL
. Baris tersebut merupakan baris rollup.
+------+---------+----------+ | year | is_male | count | +------+---------+----------+ | NULL | NULL | 12122730 | | 2000 | NULL | 4063823 | | 2000 | false | 1984255 | | 2000 | true | 2079568 | | 2001 | NULL | 4031531 | | 2001 | false | 1970770 | | 2001 | true | 2060761 | | 2002 | NULL | 4027376 | | 2002 | false | 1966519 | | 2002 | true | 2060857 | +------+---------+----------+
Saat menggunakan fungsi ROLLUP
, Anda dapat menggunakan fungsi GROUPING
untuk membedakan antara baris yang ditambahkan karena fungsi ROLLUP
dan baris yang benar-benar memiliki nilai NULL
untuk kunci grup.
Contoh
Kueri ini menambahkan fungsi GROUPING
ke contoh sebelumnya untuk mengidentifikasi baris yang ditambahkan karena fungsi ROLLUP
dengan lebih baik.
#legacySQL SELECT year, GROUPING(year) as rollup_year, is_male, GROUPING(is_male) as rollup_gender, COUNT(1) as count FROM [bigquery-public-data:samples.natality] WHERE year >= 2000 AND year <= 2002 GROUP BY ROLLUP(year, is_male) ORDER BY year, is_male;
Ini hasil yang ditampilkan pada kueri baru.
+------+-------------+---------+---------------+----------+ | year | rollup_year | is_male | rollup_gender | count | +------+-------------+---------+---------------+----------+ | NULL | 1 | NULL | 1 | 12122730 | | 2000 | 0 | NULL | 1 | 4063823 | | 2000 | 0 | false | 0 | 1984255 | | 2000 | 0 | true | 0 | 2079568 | | 2001 | 0 | NULL | 1 | 4031531 | | 2001 | 0 | false | 0 | 1970770 | | 2001 | 0 | true | 0 | 2060761 | | 2002 | 0 | NULL | 1 | 4027376 | | 2002 | 0 | false | 0 | 1966519 | | 2002 | 0 | true | 0 | 2060857 | +------+-------------+---------+---------------+----------+
Catatan:
-
Kolom yang tidak digabungkan dalam klausa
SELECT
harus dicantumkan dalam klausaGROUP BY
.#legacySQL SELECT word, corpus, COUNT(word) FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th" GROUP BY word, corpus; /* Succeeds because all non-aggregated fields are group keys. */
#legacySQL SELECT word, corpus, COUNT(word) FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th" GROUP BY word; /* Fails because corpus is not aggregated nor is it a group key. */
-
Ekspresi yang dihitung dalam klausa
SELECT
tidak dapat digunakan dalam klausaGROUP BY
yang terkait.#legacySQL SELECT word, corpus, COUNT(word) word_count FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th" GROUP BY word, corpus, word_count; /* Fails because word_count is not visible to this
GROUP BY
clause. */ - Pengelompokan menurut nilai float dan ganda tidak didukung, karena fungsi kesetaraan untuk jenis tersebut tidak ditentukan dengan baik.
-
Karena sistem ini bersifat interaktif, kueri yang menghasilkan grup dalam jumlah besar mungkin gagal. Penggunaan fungsi
TOP
, bukanGROUP BY
, dapat menyelesaikan beberapa masalah penskalaan.
Klausa HAVING
Klausa HAVING
berperilaku sama persis seperti klausa WHERE
, kecuali klausa ini dinilai setelah klausa SELECT
sehingga hasil dari semua ekspresi yang dihitung dapat dilihat oleh klausa HAVING
. Klausa HAVING hanya dapat merujuk ke output dari klausa SELECT
yang terkait.
Contoh
Kueri ini menghitung kata pertama yang paling umum dalam set data sampel n-gram yang berisi huruf a dan muncul maksimal 10.000 kali.
#legacySQL SELECT first, COUNT(ngram) ngram_count FROM [bigquery-public-data:samples.trigrams] GROUP BY 1 HAVING first contains "a" AND ngram_count < 10000 ORDER BY 2 DESC LIMIT 10;
Klausa ORDER BY
Klausa ORDER BY
mengurutkan hasil kueri dalam urutan menaik atau menurun menggunakan satu atau beberapa kolom kunci. Untuk mengurutkan berdasarkan beberapa kolom atau alias, masukkan kolom atau alias tersebut sebagai daftar yang dipisahkan koma. Hasilnya diurutkan berdasarkan kolom sesuai urutan yang tercantum.
Gunakan DESC
(menurun) atau ASC
(menaik) untuk menentukan arah pengurutan.
ASC
adalah defaultnya. Arah pengurutan yang berbeda dapat ditentukan untuk setiap kunci pengurutan.
Klausa ORDER BY
dievaluasi setelah klausa SELECT
, sehingga dapat mereferensikan output dari ekspresi apa pun yang dihitung dalam SELECT
. Jika kolom diberi alias dalam klausa SELECT
, alias tersebut harus digunakan dalam klausa ORDER BY
.
Klausa LIMIT
Klausa LIMIT
membatasi jumlah baris dalam kumpulan hasil yang ditampilkan. Karena kueri BigQuery secara rutin beroperasi pada baris yang sangat besar, LIMIT
adalah cara yang baik untuk menghindari kueri yang berjalan lama karena hanya memproses sebagian baris.
Catatan:
-
Klausa
LIMIT
akan berhenti memproses dan menampilkan hasilnya jika telah memenuhi persyaratan Anda. Hal ini dapat mengurangi waktu pemrosesan untuk beberapa kueri, tetapi saat Anda menentukan fungsi agregat seperti klausa COUNT atauORDER BY
, kumpulan hasil lengkap masih harus diproses sebelum menampilkan hasil. KlausaLIMIT
adalah klausa terakhir yang akan dievaluasi. -
Kueri dengan klausa
LIMIT
mungkin masih non-deterministik jika tidak ada operator dalam kueri yang menjamin pengurutan kumpulan hasil output. Hal ini karena BigQuery dijalankan menggunakan sejumlah besar worker paralel. Urutan kemunculan tugas paralel tidak dijamin. -
Klausa
LIMIT
tidak boleh berisi fungsi apa pun; kueri hanya menggunakan konstanta numerik. -
Saat klausa
LIMIT
digunakan, total byte yang diproses dan byte yang ditagih dapat bervariasi untuk kueri yang sama.
Tata bahasa kueri
Setiap klausa dari pernyataan SELECT
BigQuery dijelaskan secara mendetail di atas. Di sini kami menyajikan tata bahasa lengkap dari pernyataan SELECT
dalam bentuk yang ringkas dengan link kembali ke setiap bagian.
query: SELECT { * | field_path.* | expression } [ [ AS ] alias ] [ , ... ] [ FROM from_body [ WHERE bool_expression ] [ OMIT RECORD IF bool_expression] [ GROUP [ EACH ] BY [ ROLLUP ] { field_name_or_alias } [ , ... ] ] [ HAVING bool_expression ] [ ORDER BY field_name_or_alias [ { DESC | ASC } ] [, ... ] ] [ LIMIT n ] ]; from_body: { from_item [, ...] | # Warning: Comma means UNION ALL here from_item [ join_type ] JOIN [ EACH ] from_item [ ON join_predicate ] | (FLATTEN({ table_name | (query) }, field_name_or_alias)) | table_wildcard_function } from_item: { table_name | (query) } [ [ AS ] alias ] join_type: { INNER | [ FULL ] [ OUTER ] | RIGHT [ OUTER ] | LEFT [ OUTER ] | CROSS } join_predicate: field_from_one_side_of_the_join = field_from_the_other_side_of_the_join [ AND ...] expression: { literal_value | field_name_or_alias | function_call } bool_expression: { expression_which_results_in_a_boolean_value | bool_expression AND bool_expression | bool_expression OR bool_expression | NOT bool_expression }
Notasi:
- Tanda kurung siku "[ ]" menunjukkan klausa opsional.
- Tanda kurung kurawal "{ }" mencakup serangkaian opsi.
- Batang vertikal "|" menunjukkan logika OR.
- Koma atau kata kunci yang diikuti elipsis dalam tanda kurung siku "[, ... ]" menunjukkan bahwa item sebelumnya dapat diulang dalam daftar dengan pemisah yang ditentukan.
- Tanda kurung "( )" menunjukkan tanda kurung literal.
Fungsi dan operator yang didukung
Sebagian besar klausa pernyataan SELECT
mendukung fungsi. Kolom yang direferensikan dalam fungsi tidak perlu dicantumkan dalam klausa SELECT
apa pun. Oleh karena itu, kueri berikut valid, meskipun kolom clicks
tidak ditampilkan secara langsung:
#legacySQL SELECT country, SUM(clicks) FROM table GROUP BY country;
Fungsi agregat | |
---|---|
AVG() |
Menampilkan rata-rata nilai untuk sekelompok baris ... |
BIT_AND() |
Menampilkan hasil operasi bitwise AND ... |
BIT_OR() |
Menampilkan hasil operasi bitwise OR ... |
BIT_XOR() |
Menampilkan hasil operasi bitwise XOR ... |
CORR() |
Menampilkan koefisien korelasi Pearson dari sekumpulan pasangan angka. |
COUNT() |
Menampilkan jumlah total nilai ... |
COUNT([DISTINCT]) |
Menampilkan jumlah total nilai non-NULL ... |
COVAR_POP() |
Menghitung kovarians populasi dari nilai ... |
COVAR_SAMP() |
Menghitung kovarians sampel dari nilai ... |
EXACT_COUNT_DISTINCT() |
Menampilkan jumlah tepat nilai non-NULL yang berbeda untuk kolom yang ditentukan. |
FIRST() |
Menampilkan nilai berurutan pertama dalam cakupan fungsi. |
GROUP_CONCAT() |
Menggabungkan beberapa string menjadi satu string ... |
GROUP_CONCAT_UNQUOTED() |
Menggabungkan beberapa string menjadi satu string ... tidak akan menambahkan tanda kutip ganda ... |
LAST() |
Menampilkan nilai berurutan terakhir ... |
MAX() |
Menampilkan nilai maksimum ... |
MIN() |
Menampilkan nilai minimum ... |
NEST() |
Menggabungkan semua nilai dalam cakupan agregasi saat ini ke dalam kolom berulang. |
NTH() |
Menampilkan nilai berurutan ke-n ... |
QUANTILES() |
Menghitung perkiraan minimum, maksimum, dan kuantil ... |
STDDEV() |
Menampilkan simpangan baku ... |
STDDEV_POP() |
Menghitung simpangan baku populasi ... |
STDDEV_SAMP() |
Menghitung simpangan baku sampel ... |
SUM() |
Menampilkan jumlah total nilai ... |
TOP() ... COUNT(*) |
Menampilkan kumpulan data max_records teratas menurut frekuensi. |
UNIQUE() |
Menampilkan kumpulan nilai unik non-NULL ... |
VARIANCE() |
Menghitung varians dari nilai ... |
VAR_POP() |
Menghitung varians populasi dari nilai ... |
VAR_SAMP() |
Menghitung varians sampel dari nilai ... |
Operator aritmetika | |
---|---|
+ |
Penambahan |
- |
Pengurangan |
* |
Perkalian |
/ |
Pembagian |
% |
Modulus |
Fungsi bitwise | |
---|---|
& |
Bitwise AND |
| |
Bitwise OR |
^ |
Bitwise XOR |
<< |
Bitwise Shift Left |
>> |
Bitwise Shift Right |
~ |
Bitwise NOT |
BIT_COUNT() |
Menampilkan jumlah bit ... |
Fungsi transmisi | |
---|---|
BOOLEAN() |
Melakukan transmisi ke boolean. |
BYTES() |
Melakukan transmisi ke byte. |
CAST(expr AS type) |
Mengonversi expr menjadi variabel jenis type . |
FLOAT() |
Melakukan transmisi ke nilai ganda. |
HEX_STRING() |
Melakukan transmisi ke string heksadesimal. |
INTEGER() |
Melakukan transmisi ke bilangan bulat. |
STRING() |
Melakukan transmisi ke string. |
Fungsi perbandingan | |
---|---|
expr1 = expr2 |
Menampilkan true jika ekspresi sama. |
expr1 != expr2 expr1 <> expr2
|
Menampilkan true jika ekspresi tidak sama. |
expr1 > expr2 |
Menampilkan true jika expr1 lebih besar dari expr2 . |
expr1 < expr2 |
Menampilkan true jika expr1 kurang dari expr2 . |
expr1 >= expr2 |
Menampilkan true jika expr1 lebih besar dari atau sama dengan expr2 . |
expr1 <= expr2 |
Menampilkan true jika expr1 kurang dari atau sama dengan expr2 . |
expr1 BETWEEN expr2 AND expr3 |
Menampilkan true jika nilai expr1 antara expr2 dan expr3 , inklusif. |
expr IS NULL |
Menampilkan true jika expr adalah NULL. |
expr IN() |
Menampilkan true jika expr cocok dengan expr1 , expr2 , atau nilai apa pun dalam tanda kurung. |
COALESCE() |
Menampilkan argumen pertama yang bukan NULL. |
GREATEST() |
Menampilkan parameter numeric_expr terbesar. |
IFNULL() |
Jika argumen tidak bernilai null, argumen akan ditampilkan. |
IS_INF() |
Menampilkan true jika tak terhingga positif atau negatif. |
IS_NAN() |
Menampilkan true jika argumen adalah NaN . |
IS_EXPLICITLY_DEFINED() |
tidak digunakan lagi: Gunakan expr IS NOT NULL sebagai gantinya. |
LEAST() |
Menampilkan parameter numeric_expr argumen terkecil. |
NVL() |
Jika expr bukan null, expr akan ditampilkan. Jika tidak, null_default akan ditampilkan. |
Fungsi tanggal dan waktu | |
---|---|
CURRENT_DATE() |
Menampilkan tanggal saat ini dalam format %Y-%m-%d . |
CURRENT_TIME() |
Menampilkan waktu server saat ini dalam format %H:%M:%S . |
CURRENT_TIMESTAMP() |
Menampilkan waktu server saat ini dalam format %Y-%m-%d %H:%M:%S . |
DATE() |
Menampilkan tanggal dalam format %Y-%m-%d . |
DATE_ADD() |
Menambahkan interval yang ditentukan ke jenis data TIMESTAMP. |
DATEDIFF() |
Menampilkan jumlah hari antara dua jenis data TIMESTAMP. |
DAY() |
Menampilkan hari dalam sebulan sebagai bilangan bulat antara 1 dan 31. |
DAYOFWEEK() |
Menampilkan hari dalam seminggu sebagai bilangan bulat antara 1 (Minggu) dan 7 (Sabtu). |
DAYOFYEAR() |
Menampilkan hari dalam setahun sebagai bilangan bulat antara 1 dan 366. |
FORMAT_UTC_USEC() |
Menampilkan stempel waktu UNIX dalam format YYYY-MM-DD HH:MM:SS.uuuuuu . |
HOUR() |
Menampilkan jam pada TIMESTAMP sebagai bilangan bulat antara 0 dan 23. |
MINUTE() |
Menampilkan menit pada TIMESTAMP sebagai bilangan bulat antara 0 dan 59. |
MONTH() |
Menampilkan bulan pada TIMESTAMP sebagai bilangan bulat antara 1 dan 12. |
MSEC_TO_TIMESTAMP() |
Mengonversi stempel waktu UNIX dalam milidetik menjadi TIMESTAMP. |
NOW() |
Menampilkan stempel waktu UNIX saat ini dalam mikrodetik. |
PARSE_UTC_USEC() |
Mengonversi string tanggal menjadi stempel waktu UNIX dalam mikrodetik. |
QUARTER() |
Menampilkan kuartal dalam setahun pada TIMESTAMP sebagai bilangan bulat antara 1 dan 4. |
SEC_TO_TIMESTAMP() |
Mengonversi stempel waktu UNIX dalam detik menjadi TIMESTAMP. |
SECOND() |
Menampilkan detik pada TIMESTAMP sebagai bilangan bulat antara 0 dan 59. |
STRFTIME_UTC_USEC() |
Menampilkan string tanggal dalam format date_format_str. |
TIME() |
Menampilkan TIMESTAMP dalam format %H:%M:%S . |
TIMESTAMP() |
Mengonversi string tanggal menjadi TIMESTAMP. |
TIMESTAMP_TO_MSEC() |
Mengonversi TIMESTAMP menjadi stempel waktu UNIX dalam milidetik. |
TIMESTAMP_TO_SEC() |
Mengonversi TIMESTAMP menjadi stempel waktu UNIX dalam detik. |
TIMESTAMP_TO_USEC() |
Mengonversi TIMESTAMP menjadi stempel waktu UNIX dalam mikrodetik. |
USEC_TO_TIMESTAMP() |
Mengonversi stempel waktu UNIX dalam mikrodetik menjadi TIMESTAMP. |
UTC_USEC_TO_DAY() |
Menggeser stempel waktu UNIX dalam mikrodetik ke awal hari saat peristiwa terjadi. |
UTC_USEC_TO_HOUR() |
Menggeser stempel waktu UNIX dalam mikrodetik ke awal jam saat peristiwa terjadi. |
UTC_USEC_TO_MONTH() |
Menggeser stempel waktu UNIX dalam mikrodetik ke awal bulan saat peristiwa terjadi. |
UTC_USEC_TO_WEEK() |
Menampilkan stempel waktu UNIX dalam mikrodetik yang mewakili hari dalam seminggu. |
UTC_USEC_TO_YEAR() |
Menampilkan stempel waktu UNIX dalam mikrodetik yang mewakili tahun. |
WEEK() |
Menampilkan minggu pada TIMESTAMP sebagai bilangan bulat antara 1 dan 53. |
YEAR() |
Menampilkan tahun pada TIMESTAMP. |
Fungsi IP | |
---|---|
FORMAT_IP() |
Mengonversi 32 bit integer_value yang paling tidak signifikan menjadi string alamat IPv4 yang dapat dibaca manusia. |
PARSE_IP() |
Mengonversi string yang mewakili alamat IPv4 menjadi nilai bilangan bulat yang tidak bertanda tangan. |
FORMAT_PACKED_IP() |
Menampilkan alamat IP yang dapat dibaca manusia dalam bentuk 10.1.5.23 atau 2620:0:1009:1:216:36ff:feef:3f . |
PARSE_PACKED_IP() |
Menampilkan alamat IP dalam BYTES. |
Fungsi JSON | |
---|---|
JSON_EXTRACT() |
Memilih nilai berdasarkan ekspresi JSONPath dan menampilkan string JSON. |
JSON_EXTRACT_SCALAR() |
Memilih nilai berdasarkan ekspresi JSONPath dan menampilkan skalar JSON. |
Operator logika | |
---|---|
expr AND expr |
Menampilkan true jika kedua ekspresi benar. |
expr OR expr |
Menampilkan true jika salah satu atau kedua ekspresi benar. |
NOT expr |
Menampilkan true jika ekspresi salah. |
Fungsi matematika | |
---|---|
ABS() |
Menampilkan nilai absolut dari argumen. |
ACOS() |
Menampilkan kosinus terbalik dari argumen. |
ACOSH() |
Menampilkan kosinus hiperbolik terbalik dari argumen. |
ASIN() |
Menampilkan sinus terbalik dari argumen. |
ASINH() |
Menampilkan sinus hiperbolik terbalik dari argumen. |
ATAN() |
Menampilkan tangen terbalik dari argumen. |
ATANH() |
Menampilkan tangen hiperbolik terbalik dari argumen. |
ATAN2() |
Menampilkan tangen terbalik dari kedua argumen. |
CEIL() |
Membulatkan argumen ke atas ke bilangan bulat terdekat dan menampilkan nilai yang dibulatkan. |
COS() |
Menampilkan kosinus dari argumen. |
COSH() |
Menampilkan kosinus hiperbolik dari argumen. |
DEGREES() |
Mengonversi dari radian ke derajat. |
EXP() |
Menampilkan e pangkat dari argumen. |
FLOOR() |
Membulatkan argumen ke bawah ke bilangan bulat terdekat. |
LN() LOG()
|
Menampilkan logaritma natural dari argumen. |
LOG2() |
Menampilkan logaritma basis 2 dari argumen. |
LOG10() |
Menampilkan logaritma basis 10 dari argumen. |
PI() |
Menampilkan konstanta π. |
POW() |
Menampilkan argumen pertama pangkat argumen kedua. |
RADIANS() |
Mengonversi dari derajat ke radian. |
RAND() |
Menampilkan nilai float acak dalam rentang 0,0 <= nilai < 1,0. |
ROUND() |
Membulatkan argumen ke atas atau ke bawah ke bilangan bulat terdekat. |
SIN() |
Menampilkan sinus dari argumen. |
SINH() |
Menampilkan sinus hiperbolik dari argumen. |
SQRT() |
Menampilkan akar kuadrat dari ekspresi. |
TAN() |
Menampilkan tangen dari argumen. |
TANH() |
Menampilkan tangen hiperbolik dari argumen. |
Fungsi ekspresi reguler | |
---|---|
REGEXP_MATCH() |
Menampilkan true jika argumen cocok dengan ekspresi reguler. |
REGEXP_EXTRACT() |
Menampilkan bagian argumen yang cocok dengan grup tangkapan dalam ekspresi reguler. |
REGEXP_REPLACE() |
Menggantikan substring yang cocok dengan ekspresi reguler. |
Fungsi string | |
---|---|
CONCAT() |
Menampilkan penggabungan dua string atau lebih, atau NULL jika salah satu nilainya adalah NULL. |
expr CONTAINS 'str' |
Menampilkan true jika expr berisi argumen string yang ditentukan. |
INSTR() |
Menampilkan indeks berbasis satu dari kemunculan pertama string. |
LEFT() |
Menampilkan karakter paling kiri dari string. |
LENGTH() |
Menampilkan panjang string. |
LOWER() |
Menampilkan string asli dengan semua karakter dalam huruf kecil. |
LPAD() |
Menyisipkan karakter di sebelah kiri string. |
LTRIM() |
Menghapus karakter dari sisi kiri string. |
REPLACE() |
Mengganti semua kemunculan substring. |
RIGHT() |
Menampilkan karakter paling kanan dari string. |
RPAD() |
Menyisipkan karakter ke sisi kanan string. |
RTRIM() |
Menghapus karakter di akhir dari sisi kanan string. |
SPLIT() |
Memisahkan string menjadi beberapa substring berulang. |
SUBSTR() |
Menampilkan substring ... |
UPPER() |
Menampilkan string asli dengan semua karakter dalam huruf besar. |
Fungsi karakter pengganti tabel | |
---|---|
TABLE_DATE_RANGE() |
Membuat kueri beberapa tabel harian yang mencakup rentang tanggal. |
TABLE_DATE_RANGE_STRICT() |
Membuat kueri beberapa tabel harian yang mencakup rentang tanggal, tanpa tanggal yang hilang. |
TABLE_QUERY() |
Membuat kueri tabel yang namanya cocok dengan predikat yang ditentukan. |
Fungsi URL | |
---|---|
HOST() |
Pada URL yang diberikan, fungsi ini menampilkan nama host sebagai string. |
DOMAIN() |
Pada URL yang diberikan, fungsi ini menampilkan domain sebagai string. |
TLD() |
Pada URL yang diberikan, fungsi ini menampilkan domain level teratas plus domain negara apa pun di URL tersebut. |
Fungsi jendela | |
---|---|
AVG() COUNT(*) COUNT([DISTINCT]) MAX() MIN() STDDEV() SUM() |
Operasi yang sama dengan Fungsi agregat yang sesuai, tetapi dihitung melalui jendela yang ditentukan oleh klausa OVER. |
CUME_DIST() |
Menampilkan nilai ganda yang menunjukkan distribusi kumulatif nilai dalam grup nilai ... |
DENSE_RANK() |
Menampilkan peringkat bilangan bulat nilai dalam grup nilai. |
FIRST_VALUE() |
Menampilkan nilai pertama pada kolom yang ditentukan di jendela. |
LAG() |
Memungkinkan Anda membaca data dari baris sebelumnya dalam jendela. |
LAST_VALUE() |
Menampilkan nilai terakhir pada kolom yang ditentukan di jendela. |
LEAD() |
Memungkinkan Anda membaca data dari baris selanjutnya dalam jendela. |
NTH_VALUE() |
Menampilkan nilai <expr> di posisi <n> pada bingkai jendela ...
|
NTILE() |
Membagi jendela ke dalam jumlah bucket yang ditentukan. |
PERCENT_RANK() |
Menampilkan peringkat baris saat ini, relatif terhadap baris lain dalam partisi. |
PERCENTILE_CONT() |
Menampilkan nilai interpolasi yang akan dipetakan ke argumen persentil sehubungan dengan jendela ... |
PERCENTILE_DISC() |
Menampilkan nilai yang paling dekat dengan persentil argumen pada jendela. |
RANK() |
Menampilkan peringkat bilangan bulat nilai dalam grup nilai. |
RATIO_TO_REPORT() |
Menampilkan rasio setiap nilai terhadap jumlah nilai. |
ROW_NUMBER() |
Menampilkan nomor baris saat ini dari hasil kueri pada jendela. |
Fungsi lainnya | |
---|---|
CASE WHEN ... THEN |
Gunakan CASE untuk memilih di antara dua atau beberapa ekspresi alternatif dalam kueri Anda. |
CURRENT_USER() |
Menampilkan alamat email pengguna yang menjalankan kueri. |
EVERY() |
Menampilkan true jika argumen benar untuk semua inputnya. |
FROM_BASE64() |
Mengonversi string input berenkode base-64 ke format BYTES. |
HASH() |
Menghitung dan menampilkan nilai hash yang ditandatangani 64-bit ... |
FARM_FINGERPRINT() |
Menghitung dan menampilkan nilai sidik jari 64-bit yang ditandatangani ... |
IF() |
Jika argumen pertama benar, argumen kedua akan ditampilkan. Jika tidak, argumen ketiga akan ditampilkan. |
POSITION() |
Menampilkan posisi argumen berbasis satu dan berurutan. |
SHA1() |
Menampilkan hash SHA1, dalam format BYTES. |
SOME() |
Menampilkan true jika argumen benar untuk setidaknya salah satu inputnya. |
TO_BASE64() |
Mengonversi argumen BYTES kei string berenkode base-64. |
Fungsi agregat
Fungsi agregat menampilkan nilai yang mewakili ringkasan set data yang lebih besar, yang membuat fungsi ini sangat berguna untuk menganalisis log. Fungsi agregat beroperasi terhadap kumpulan nilai dan menampilkan satu nilai per tabel, grup, atau cakupan:
- Agregasi tabel
Menggunakan fungsi agregat untuk meringkas semua baris yang memenuhi syarat dalam tabel. Contoh:
SELECT COUNT(f1) FROM ds.Table;
- Agregasi grup
Menggunakan fungsi agregat dan klausa
GROUP BY
yang menentukan kolom non-gabungan untuk meringkas baris berdasarkan grup. Contoh:SELECT COUNT(f1) FROM ds.Table GROUP BY b1;
Fungsi TOP mewakili kasus khusus agregasi grup.
- Agregasi cakupan
Fitur ini hanya berlaku untuk tabel yang memiliki kolom bertingkat.
Menggunakan fungsi agregat dan kata kunciWITHIN
untuk menggabungkan nilai berulang dalam cakupan yang ditentukan. Contoh:SELECT COUNT(m1.f2) WITHIN RECORD FROM Table;
Cakupannya dapat berupa
RECORD
, yang sesuai dengan seluruh baris, atau node (kolom berulang dalam satu baris). Fungsi agregasi beroperasi pada nilai-nilai dalam cakupan dan menampilkan hasil gabungan untuk setiap kumpulan data atau node.
Anda dapat menerapkan batasan ke fungsi agregat menggunakan salah satu opsi berikut:
-
Alias dalam kueri subpilihan. Batasan ditentukan dalam klausa
WHERE
luar.#legacySQL SELECT corpus, count_corpus_words FROM (SELECT corpus, count(word) AS count_corpus_words FROM [bigquery-public-data:samples.shakespeare] GROUP BY corpus) AS sub_shakespeare WHERE count_corpus_words > 4000
-
Alias dalam klausa HAVING.
#legacySQL SELECT corpus, count(word) AS count_corpus_words FROM [bigquery-public-data:samples.shakespeare] GROUP BY corpus HAVING count_corpus_words > 4000;
Anda juga dapat merujuk ke alias dalam klausa GROUP BY
atau ORDER BY
.
Sintaks
Fungsi agregat | |
---|---|
AVG() |
Menampilkan rata-rata nilai untuk sekelompok baris ... |
BIT_AND() |
Menampilkan hasil operasi bitwise AND ... |
BIT_OR() |
Menampilkan hasil operasi bitwise OR ... |
BIT_XOR() |
Menampilkan hasil operasi bitwise XOR ... |
CORR() |
Menampilkan koefisien korelasi Pearson dari sekumpulan pasangan angka. |
COUNT() |
Menampilkan jumlah total nilai ... |
COUNT([DISTINCT]) |
Menampilkan jumlah total nilai non-NULL ... |
COVAR_POP() |
Menghitung kovarians populasi dari nilai ... |
COVAR_SAMP() |
Menghitung kovarians sampel dari nilai ... |
EXACT_COUNT_DISTINCT() |
Menampilkan jumlah tepat nilai non-NULL yang berbeda untuk kolom yang ditentukan. |
FIRST() |
Menampilkan nilai berurutan pertama dalam cakupan fungsi. |
GROUP_CONCAT() |
Menggabungkan beberapa string menjadi satu string ... |
GROUP_CONCAT_UNQUOTED() |
Menggabungkan beberapa string menjadi satu string ... tidak akan menambahkan tanda kutip ganda ... |
LAST() |
Menampilkan nilai berurutan terakhir ... |
MAX() |
Menampilkan nilai maksimum ... |
MIN() |
Menampilkan nilai minimum ... |
NEST() |
Menggabungkan semua nilai dalam cakupan agregasi saat ini ke dalam kolom berulang. |
NTH() |
Menampilkan nilai berurutan ke-n ... |
QUANTILES() |
Menghitung perkiraan minimum, maksimum, dan kuantil ... |
STDDEV() |
Menampilkan simpangan baku ... |
STDDEV_POP() |
Menghitung simpangan baku populasi ... |
STDDEV_SAMP() |
Menghitung simpangan baku sampel ... |
SUM() |
Menampilkan jumlah total nilai ... |
TOP() ... COUNT(*) |
Menampilkan kumpulan data max_records teratas menurut frekuensi. |
UNIQUE() |
Menampilkan kumpulan nilai unik non-NULL ... |
VARIANCE() |
Menghitung varians dari nilai ... |
VAR_POP() |
Menghitung varians populasi dari nilai ... |
VAR_SAMP() |
Menghitung varians sampel dari nilai ... |
AVG(numeric_expr)
- Menampilkan rata-rata nilai untuk sekelompok baris yang dihitung oleh
numeric_expr
. Baris dengan nilai NULL tidak disertakan dalam penghitungan. BIT_AND(numeric_expr)
- Menampilkan hasil operasi bitwise
AND
antara setiap instancenumeric_expr
di semua baris. NilaiNULL
diabaikan. Fungsi ini menampilkanNULL
jika semua instancenumeric_expr
bernilaiNULL
. BIT_OR(numeric_expr)
- Menampilkan hasil operasi bitwise
OR
antara setiap instancenumeric_expr
di semua baris. NilaiNULL
diabaikan. Fungsi ini menampilkanNULL
jika semua instancenumeric_expr
bernilaiNULL
. BIT_XOR(numeric_expr)
- Menampilkan hasil operasi bitwise
XOR
antara setiap instancenumeric_expr
di semua baris. NilaiNULL
diabaikan. Fungsi ini menampilkanNULL
jika semua instancenumeric_expr
bernilaiNULL
. CORR(numeric_expr, numeric_expr)
- Menampilkan koefisien korelasi Pearson dari sekumpulan pasangan angka.
COUNT(*)
- Menampilkan jumlah total nilai (NULL dan non-NULL) dalam cakupan fungsi. Sebaiknya tentukan kolom yang akan dihitung secara eksplisit, kecuali jika Anda menggunakan
COUNT(*)
dengan fungsiTOP
. COUNT([DISTINCT] field [, n])
- Menampilkan jumlah total nilai non-NULL dalam cakupan fungsi.
Jika Anda menggunakan kata kunci
DISTINCT
, fungsi tersebut akan menampilkan jumlah nilai yang berbeda untuk kolom yang ditentukan. Perhatikan bahwa nilai yang ditampilkan untukDISTINCT
adalah perkiraan statistik dan tidak dijamin tepat.Gunakan
EXACT_COUNT_DISTINCT()
untuk mendapatkan jawaban yang tepat.Jika memerlukan akurasi yang lebih tinggi dari
, Anda dapat menentukan parameter kedua,COUNT(DISTINCT)
n
, yang memberikan nilai minimum. Jika nilainya kurang dari nilai minimum tersebut, hasil yang tepat akan dijamin. Secara default,n
adalah 1.000, tetapi jika Anda memberikann
yang lebih besar, Anda akan mendapatkan hasil yang tepat untukCOUNT(DISTINCT)
hingga nilain
tersebut. Namun, memberikan nilain
yang lebih besar akan mengurangi skalabilitas operator ini dan dapat meningkatkan waktu eksekusi kueri secara signifikan atau menyebabkan kueri gagal.Untuk menghitung jumlah nilai yang berbeda secara tepat, gunakan EXACT_COUNT_DISTINCT. Atau, untuk pendekatan yang lebih skalabel, pertimbangkan untuk menggunakan
GROUP EACH BY
di kolom yang relevan, lalu terapkanCOUNT(*)
. PendekatanGROUP EACH BY
lebih skalabel, tetapi mungkin menimbulkan sedikit penalti performa di awal. COVAR_POP(numeric_expr1, numeric_expr2)
- Menghitung kovarians populasi dari nilai yang dihitung oleh
numeric_expr1
dannumeric_expr2
. COVAR_SAMP(numeric_expr1, numeric_expr2)
- Menghitung kovarians sampel dari nilai yang dihitung oleh
numeric_expr1
dannumeric_expr2
. EXACT_COUNT_DISTINCT(field)
- Menampilkan jumlah tepat nilai non-NULL yang berbeda untuk kolom yang ditentukan. Untuk skalabilitas dan performa yang lebih baik, gunakan COUNT(DISTINCT field).
FIRST(expr)
- Menampilkan nilai berurutan pertama dalam cakupan fungsi.
GROUP_CONCAT('str' [, separator])
-
Menggabungkan beberapa string menjadi satu string, dengan setiap nilai dipisahkan oleh parameter
separator
opsional. Jikaseparator
dihilangkan, BigQuery akan menampilkan string yang dipisahkan koma.Jika string dalam data sumber berisi karakter tanda kutip ganda,
GROUP_CONCAT
akan menampilkan string dengan penambahan tanda kutip ganda. Misalnya, stringa"b
akan ditampilkan sebagai"a""b"
. GunakanGROUP_CONCAT_UNQUOTED
jika Anda lebih suka string ini tidak ditampilkan dengan penambahan tanda kutip ganda.Contoh:
#legacySQL SELECT GROUP_CONCAT(x) FROM ( SELECT 'a"b' AS x), ( SELECT 'cd' AS x);
GROUP_CONCAT_UNQUOTED('str' [, separator])
-
Menggabungkan beberapa string menjadi satu string, dengan setiap nilai dipisahkan oleh parameter
separator
opsional. Jikaseparator
dihilangkan, BigQuery akan menampilkan string yang dipisahkan koma.Tidak seperti
GROUP_CONCAT
, fungsi ini tidak akan menambahkan tanda kutip ganda ke nilai yang ditampilkan yang menyertakan karakter tanda kutip ganda. Misalnya, stringa"b
akan ditampilkan sebagaia"b
.Contoh:
#legacySQL SELECT GROUP_CONCAT_UNQUOTED(x) FROM ( SELECT 'a"b' AS x), ( SELECT 'cd' AS x);
LAST(field)
- Menampilkan nilai berurutan terakhir dalam cakupan fungsi.
MAX(field)
- Menampilkan nilai maksimum dalam cakupan fungsi.
MIN(field)
- Menampilkan nilai minimum dalam cakupan fungsi.
NEST(expr)
-
Menggabungkan semua nilai dalam cakupan agregasi saat ini ke dalam kolom berulang. Misalnya, kueri
"SELECT x, NEST(y) FROM ... GROUP BY x"
menampilkan satu kumpulan data output untuk setiap nilaix
yang berbeda, dan berisi kolom berulang untuk semua nilaiy
yang dipasangkan denganx
di input kueri. FungsiNEST
memerlukan klausaGROUP BY
.BigQuery secara otomatis akan meratakan hasil kueri, sehingga jika Anda menggunakan fungsi
NEST
pada kueri tingkat teratas, hasilnya tidak akan berisi kolom berulang. Gunakan fungsiNEST
saat menggunakan subpilihan yang memberikan hasil menengah agar dapat langsung digunakan oleh kueri yang sama. NTH(n, field)
- Menampilkan nilai berurutan ke-
n
dalam cakupan fungsi, dengann
sebagai konstanta. FungsiNTH
mulai menghitung dari 1, sehingga tidak ada suku nol. Jika cakupan fungsi memiliki nilai kurang darin
, fungsi ini akan menampilkanNULL
. QUANTILES(expr[, buckets])
-
Menghitung perkiraan minimum, maksimum, dan kuantil untuk ekspresi input. Nilai input
NULL
diabaikan. Input kosong atauNULL
saja akan menghasilkan outputNULL
. Jumlah kuantil yang dihitung dikontrol dengan parameterbuckets
opsional, yang mencakup jumlah minimum dan maksimum. Untuk menghitung perkiraan N-tile, gunakan N+1buckets
. Nilai defaultbuckets
adalah 100. (Catatan: Nilai default 100 tidak memperkirakan persentil. Untuk memperkirakan persentil, gunakan minimum 101buckets
.) Jika ditentukan secara eksplisit,buckets
minimal harus 2.Error pecahan per kuantil adalah epsilon = 1/
buckets
, yang berarti error berkurang seiring dengan bertambahnya jumlah bucket. Contoh:QUANTILES(<expr>, 2) # computes min and max with 50% error. QUANTILES(<expr>, 3) # computes min, median, and max with 33% error. QUANTILES(<expr>, 5) # computes quartiles with 25% error. QUANTILES(<expr>, 11) # computes deciles with 10% error. QUANTILES(<expr>, 21) # computes vigintiles with 5% error. QUANTILES(<expr>, 101) # computes percentiles with 1% error.
Fungsi
NTH
dapat digunakan untuk memilih kuantil tertentu, tetapi perlu diingat bahwaNTH
didasarkan pada angka 1, dan bahwaQUANTILES
menampilkan nilai minimum (kuantil "ke-0") di posisi pertama, dan nilai maksimum (persentil "ke-100" atau N-tile "ke-N") di posisi terakhir. Misalnya,NTH(11, QUANTILES(expr, 21))
memperkirakan medianexpr
, sedangkanNTH(20, QUANTILES(expr, 21))
memperkirakan vigintil ke-19 (persentil ke-95) dariexpr
. Kedua estimasi tersebut memiliki margin error 5%.Untuk meningkatkan akurasi, gunakan lebih banyak bucket. Misalnya, untuk mengurangi margin error pada penghitungan sebelumnya dari 5% menjadi 0,1%, gunakan 1.001 bucket, bukan 21, dan sesuaikan argumen ke fungsi
NTH
. Untuk menghitung median dengan error 0,1%, gunakanNTH(501, QUANTILES(expr, 1001))
; untuk persentil ke-95 dengan error 0,1%, gunakanNTH(951, QUANTILES(expr, 1001))
. STDDEV(numeric_expr)
- Menampilkan simpangan baku dari nilai yang dihitung oleh
numeric_expr
. Baris dengan nilai NULL tidak disertakan dalam penghitungan. FungsiSTDDEV
adalah alias untukSTDDEV_SAMP
. STDDEV_POP(numeric_expr)
- Menghitung simpangan baku populasi dari nilai yang dihitung oleh
numeric_expr
. GunakanSTDDEV_POP()
untuk menghitung simpangan baku set data yang mencakup seluruh populasi yang diinginkan. Jika set data Anda hanya terdiri dari sampel perwakilan populasi, gunakanSTDDEV_SAMP()
sebagai gantinya. Untuk mengetahui informasi selengkapnya tentang populasi versus simpangan baku, lihat Simpangan baku di Wikipedia. STDDEV_SAMP(numeric_expr)
- Menghitung simpangan baku sampel dari nilai yang dihitung oleh
numeric_expr
. GunakanSTDDEV_SAMP()
untuk menghitung simpangan baku seluruh populasi berdasarkan sampel perwakilan populasi. Jika set data Anda terdiri dari seluruh populasi, gunakanSTDDEV_POP()
. Untuk mengetahui informasi selengkapnya tentang populasi versus simpangan baku, lihat Simpangan baku di Wikipedia. SUM(field)
- Menampilkan jumlah total nilai dalam cakupan fungsi. Hanya untuk digunakan dengan jenis data numerik.
TOP(field|alias[, max_values][,multiplier]) ... COUNT(*)
- Menampilkan kumpulan data max_records teratas menurut frekuensi. Lihat deskripsi fungsi TOP di bawah untuk mengetahui detailnya.
UNIQUE(expr)
- Menampilkan kumpulan nilai unik non-NULL dalam cakupan fungsi dengan urutan yang tidak ditentukan. Serupa dengan klausa
GROUP BY
besar tanpa kata kunciEACH
, kueri akan gagal dengan error "Resources Exceeded" jika ada terlalu banyak nilai yang berbeda. Namun, tidak sepertiGROUP BY
, fungsiUNIQUE
dapat diterapkan dengan agregasi cakupan, sehingga memungkinkan operasi yang efisien pada kolom bertingkat dengan jumlah nilai yang terbatas. VARIANCE(numeric_expr)
- Menghitung varians dari nilai yang dihitung oleh
numeric_expr
. Baris dengan nilai NULL tidak disertakan dalam penghitungan. FungsiVARIANCE
adalah alias untukVAR_SAMP
. VAR_POP(numeric_expr)
- Menghitung varians populasi dari nilai yang dihitung oleh
numeric_expr
. Untuk mengetahui informasi selengkapnya tentang populasi versus simpangan baku, lihat Simpangan baku di Wikipedia. VAR_SAMP(numeric_expr)
- Menghitung varians sampel dari nilai yang dihitung oleh
numeric_expr
. Untuk mengetahui informasi selengkapnya tentang populasi versus simpangan baku, lihat Simpangan baku di Wikipedia.
Fungsi TOP()
TOP adalah fungsi yang merupakan alternatif dari klausa GROUP BY. Fungsi ini digunakan sebagai sintaksis yang disederhanakan untuk GROUP BY ... ORDER BY ... LIMIT ...
. Umumnya, fungsi TOP berperforma lebih cepat dibandingkan kueri ... GROUP BY ... ORDER BY ... LIMIT ...
lengkap, tetapi hanya dapat menampilkan hasil perkiraan. Berikut adalah sintaksis untuk fungsi TOP:
TOP(field|alias[, max_values][,multiplier]) ... COUNT(*)
Saat menggunakan fungsi TOP dalam klausa SELECT
, Anda harus menyertakan COUNT(*)
sebagai salah satu kolom.
Kueri yang menggunakan fungsi TOP() hanya dapat menampilkan dua kolom: kolom TOP dan nilai COUNT(*).
field|alias
- Kolom atau alias yang akan ditampilkan.
max_values
- [Opsional] Jumlah hasil maksimum yang akan ditampilkan. Defaultnya adalah 20.
multiplier
- Bilangan bulat positif yang meningkatkan nilai yang ditampilkan oleh
COUNT(*)
berdasarkan kelipatan yang ditentukan.
Contoh fungsi TOP()
-
Contoh kueri dasar yang menggunakan
TOP()
Kueri berikut menggunakan
TOP()
untuk menampilkan 10 baris.Contoh 1:
#legacySQL SELECT TOP(word, 10) as word, COUNT(*) as cnt FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th";
Contoh 2:
#legacySQL SELECT word, left(word, 3) FROM (SELECT TOP(word, 10) AS word, COUNT(*) FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th");
-
Bandingkan
TOP()
denganGROUP BY...ORDER BY...LIMIT
Kueri akan menampilkan, secara berurutan, 10 kata teratas yang paling sering digunakan yang berisi kata "th", dan jumlah dokumen yang digunakan untuk menggunakan kata tersebut. Kueri
TOP
akan dijalankan jauh lebih cepat:Contoh tanpa
TOP()
:#legacySQL SELECT word, COUNT(*) AS cnt FROM ds.Table WHERE word CONTAINS 'th' GROUP BY word ORDER BY cnt DESC LIMIT 10;
Contoh dengan
TOP()
:#legacySQL SELECT TOP(word, 10), COUNT(*) FROM ds.Table WHERE word contains 'th';
-
Menggunakan parameter
multiplier
.Kueri berikut menunjukkan bagaimana parameter
multiplier
memengaruhi hasil kueri. Kueri pertama menampilkan jumlah kelahiran per bulan di Wyoming. Kueri kedua menggunakan parametermultiplier
untuk mengalikan nilaicnt
dengan 100.Contoh tanpa parameter
multiplier
:#legacySQL SELECT TOP(month,3) as month, COUNT(*) as cnt FROM [bigquery-public-data:samples.natality] WHERE state = "WY";
Hasil:
+-------+-------+ | month | cnt | +-------+-------+ | 7 | 19594 | | 5 | 19038 | | 8 | 19030 | +-------+-------+
Contoh dengan parameter
multiplier
:#legacySQL SELECT TOP(month,3,100) as month, COUNT(*) as cnt FROM [bigquery-public-data:samples.natality] WHERE state = "WY";
Hasil:
+-------+---------+ | month | cnt | +-------+---------+ | 7 | 1959400 | | 5 | 1903800 | | 8 | 1903000 | +-------+---------+
Catatan: Anda harus menyertakan COUNT(*)
dalam klausa SELECT
untuk menggunakan TOP
.
Contoh lanjutan
-
Simpangan rata-rata dan simpangan baku yang dikelompokkan menurut kondisi
Kueri berikut menampilkan simpangan rata-rata dan simpangan baku dari berat bayi baru lahir di Ohio pada tahun 2003, yang dikelompokkan menurut ibu yang merokok dan tidak merokok.
Contoh:
#legacySQL SELECT cigarette_use, /* Finds average and standard deviation */ AVG(weight_pounds) baby_weight, STDDEV(weight_pounds) baby_weight_stdev, AVG(mother_age) mother_age FROM [bigquery-public-data:samples.natality] WHERE year=2003 AND state='OH' /* Group the result values by those */ /* who smoked and those who didn't. */ GROUP BY cigarette_use;
-
Memfilter hasil kueri menggunakan nilai gabungan
Untuk memfilter hasil kueri menggunakan nilai gabungan (misalnya, memfilter menurut nilai
SUM
), gunakan fungsiHAVING
.HAVING
membandingkan nilai dengan hasil yang ditentukan oleh fungsi agregasi, bukanWHERE
, yang beroperasi di setiap baris sebelum agregasi.Contoh:
#legacySQL SELECT state, /* If 'is_male' is True, return 'Male', */ /* otherwise return 'Female' */ IF (is_male, 'Male', 'Female') AS sex, /* The count value is aliased as 'cnt' */ /* and used in the HAVING clause below. */ COUNT(*) AS cnt FROM [bigquery-public-data:samples.natality] WHERE state != '' GROUP BY state, sex HAVING cnt > 3000000 ORDER BY cnt DESC
Hasil:
+-------+--------+---------+ | state | sex | cnt | +-------+--------+---------+ | CA | Male | 7060826 | | CA | Female | 6733288 | | TX | Male | 5107542 | | TX | Female | 4879247 | | NY | Male | 4442246 | | NY | Female | 4227891 | | IL | Male | 3089555 | +-------+--------+---------+
Operator aritmetika
Operator aritmetika mengambil argumen numerik dan menampilkan hasil numerik. Setiap argumen dapat berupa literal numerik atau nilai numerik yang ditampilkan oleh kueri. Jika operasi aritmetika bernilai hasil yang tidak ditentukan, operasi tersebut akan menampilkan NULL
.
Sintaks
Operator | Deskripsi | Contoh |
---|---|---|
+ | Penambahan |
Hasil: 10 |
- | Pengurangan |
Hasil: 1 |
* | Perkalian |
Hasil: 24 |
/ | Pembagian |
Hasil: 1,5 |
% | Modulus |
Hasil: 2 |
Fungsi bitwise
Fungsi bitwise beroperasi pada tingkat bit individual dan memerlukan argumen numerik. Untuk mengetahui informasi selengkapnya tentang fungsi bitwise, lihat Operasi bitwise.
Tiga fungsi bitwise tambahan, BIT_AND
, BIT_OR
, dan BIT_XOR
, didokumentasikan dalam fungsi agregat.
Sintaks
Operator | Deskripsi | Contoh |
---|---|---|
& | Bitwise AND |
Hasil: 0 |
| | Bitwise OR |
Hasil: 28 |
^ | Bitwise XOR |
Hasil: 1 |
<< | Bitwise Shift Left |
Hasil: 16 |
>> | Bitwise Shift Right |
Hasil: 2 |
~ | Bitwise NOT |
Hasil: -3 |
BIT_COUNT(<numeric_expr>) |
Menampilkan jumlah bit yang ditetapkan di |
Hasil: 4 |
Fungsi transmisi
Fungsi transmisi mengubah jenis data ekspresi numerik. Fungsi transmisi sangat berguna untuk memastikan bahwa argumen dalam fungsi perbandingan memiliki jenis data yang sama.
Sintaks
Fungsi transmisi | |
---|---|
BOOLEAN() |
Melakukan transmisi ke boolean. |
BYTES() |
Melakukan transmisi ke byte. |
CAST(expr AS type) |
Mengonversi expr menjadi variabel jenis type . |
FLOAT() |
Melakukan transmisi ke nilai ganda. |
HEX_STRING() |
Melakukan transmisi ke string heksadesimal. |
INTEGER() |
Melakukan transmisi ke bilangan bulat. |
STRING() |
Melakukan transmisi ke string. |
BOOLEAN(<numeric_expr>)
-
- Menampilkan
true
jika<numeric_expr>
bukan 0 dan bukan NULL. - Menampilkan
false
jika<numeric_expr>
adalah 0. - Menampilkan
NULL
jika<numeric_expr>
adalah NULL.
- Menampilkan
BYTES(string_expr)
- Menampilkan
string_expr
sebagai nilai jenisbytes
. CAST(expr AS type)
- Mengonversi
expr
menjadi variabel jenistype
. FLOAT(expr)
-
Menampilkan
expr
sebagai nilai ganda.expr
dapat berupa string seperti'45.78'
, tetapi fungsi ini akan menampilkanNULL
untuk nilai non-numerik. HEX_STRING(numeric_expr)
- Menampilkan
numeric_expr
sebagai string heksadesimal. INTEGER(expr)
-
Mentransmisikan
expr
ke bilangan bulat 64-bit.- Menampilkan NULL jika
expr
adalah string yang tidak sesuai dengan nilai bilangan bulat. - Menampilkan jumlah mikrodetik sejak epoch Unix jika
expr
adalah stempel waktu.
- Menampilkan NULL jika
STRING(numeric_expr)
- Menampilkan
numeric_expr
sebagai string.
Fungsi perbandingan
Fungsi perbandingan menampilkan true
atau false
, berdasarkan jenis perbandingan berikut:
- Perbandingan dua ekspresi.
- Perbandingan ekspresi atau kumpulan ekspresi dengan kriteria tertentu, seperti berada di daftar yang ditentukan, menjadi NULL, atau menjadi nilai opsional non-default.
Beberapa fungsi yang tercantum di bawah menampilkan nilai selain true
atau false
, tetapi nilai yang ditampilkan didasarkan pada operasi perbandingan.
Anda dapat menggunakan ekspresi numerik atau string sebagai argumen untuk fungsi perbandingan. (Konstanta string harus diapit oleh tanda kutip tunggal atau ganda.) Ekspresi dapat berupa literal atau nilai yang diambil oleh kueri. Fungsi perbandingan paling sering digunakan sebagai kondisi pemfilteran di klausa WHERE
, tetapi dapat digunakan dalam klausa lain.
Sintaks
Fungsi perbandingan | |
---|---|
expr1 = expr2 |
Menampilkan true jika ekspresi sama. |
expr1 != expr2 expr1 <> expr2
|
Menampilkan true jika ekspresi tidak sama. |
expr1 > expr2 |
Menampilkan true jika expr1 lebih besar dari expr2 . |
expr1 < expr2 |
Menampilkan true jika expr1 kurang dari expr2 . |
expr1 >= expr2 |
Menampilkan true jika expr1 lebih besar dari atau sama dengan expr2 . |
expr1 <= expr2 |
Menampilkan true jika expr1 kurang dari atau sama dengan expr2 . |
expr1 BETWEEN expr2 AND expr3 |
Menampilkan true jika nilai expr1 antara expr2 dan expr3 , inklusif. |
expr IS NULL |
Menampilkan true jika expr adalah NULL. |
expr IN() |
Menampilkan true jika expr cocok dengan expr1 , expr2 , atau nilai apa pun dalam tanda kurung. |
COALESCE() |
Menampilkan argumen pertama yang bukan NULL. |
GREATEST() |
Menampilkan parameter numeric_expr terbesar. |
IFNULL() |
Jika argumen tidak bernilai null, argumen akan ditampilkan. |
IS_INF() |
Menampilkan true jika tak terhingga positif atau negatif. |
IS_NAN() |
Menampilkan true jika argumen adalah NaN . |
IS_EXPLICITLY_DEFINED() |
tidak digunakan lagi: Gunakan expr IS NOT NULL sebagai gantinya. |
LEAST() |
Menampilkan parameter numeric_expr argumen terkecil. |
NVL() |
Jika expr bukan null, expr akan ditampilkan. Jika tidak, null_default akan ditampilkan. |
expr1 = expr2
- Menampilkan
true
jika ekspresi sama. expr1 != expr2
expr1 <> expr2
- Menampilkan
true
jika ekspresi tidak sama. expr1 > expr2
- Menampilkan
true
jikaexpr1
lebih besar dariexpr2
. expr1 < expr2
- Menampilkan
true
jikaexpr1
kurang dariexpr2
. expr1 >= expr2
- Menampilkan
true
jikaexpr1
lebih besar dari atau sama denganexpr2
. expr1 <= expr2
- Menampilkan
true
jikaexpr1
kurang dari atau sama denganexpr2
. expr1 BETWEEN expr2 AND expr3
-
Menampilkan
true
jika nilaiexpr1
lebih besar dari atau sama denganexpr2
, dan kurang dari atau sama denganexpr3
. expr IS NULL
- Menampilkan
true
jikaexpr
adalah NULL. expr IN(expr1, expr2, ...)
- Menampilkan
true
jikaexpr
cocok denganexpr1
,expr2
, atau nilai apa pun dalam tanda kurung. Kata kunciIN
adalah penyederhanaan yang efisien untuk(expr = expr1 || expr = expr2 || ...)
. Ekspresi yang digunakan dengan kata kunciIN
harus berupa konstanta dan harus cocok dengan jenis dataexpr
. KlausaIN
juga dapat digunakan untuk membuat semi-join dan anti-join. Untuk mengetahui informasi selengkapnya, lihat Semi-join dan Anti-join. COALESCE(<expr1>, <expr2>, ...)
- Menampilkan argumen pertama yang bukan NULL.
GREATEST(numeric_expr1, numeric_expr2, ...)
-
Menampilkan parameter
numeric_expr
terbesar. Semua parameter harus berupa angka, dan semua parameter harus berjenis sama. Jika parameter apa pun bernilaiNULL
, fungsi ini akan menampilkanNULL
.Untuk mengabaikan nilai
NULL
, gunakan fungsiIFNULL
untuk mengubah nilaiNULL
ke nilai yang tidak memengaruhi perbandingan. Pada contoh kode berikut, fungsiIFNULL
digunakan untuk mengubah nilaiNULL
menjadi-1
, yang tidak memengaruhi perbandingan antara angka positif.SELECT GREATEST(IFNULL(a,-1), IFNULL(b,-1)) FROM (SELECT 1 as a, NULL as b);
IFNULL(expr, null_default)
- Jika
expr
bukan null,expr
akan ditampilkan. Jika tidak,null_default
akan ditampilkan. IS_INF(numeric_expr)
- Menampilkan
true
jikanumeric_expr
adalah tak terhingga positif atau negatif. IS_NAN(numeric_expr)
- Menampilkan
true
jikanumeric_expr
adalah nilai numerikNaN
khusus. IS_EXPLICITLY_DEFINED(expr)
-
Fungsi ini tidak digunakan lagi. Sebagai gantinya, gunakan
expr IS NOT NULL
. LEAST(numeric_expr1, numeric_expr2, ...)
-
Menampilkan parameter
numeric_expr
terkecil. Semua parameter harus berupa angka, dan semua parameter harus berjenis sama. Jika parameter apa pun bernilaiNULL
, fungsi ini akan menampilkanNULL
NVL(expr, null_default)
- Jika
expr
bukan null,expr
akan ditampilkan. Jika tidak,null_default
akan ditampilkan. FungsiNVL
adalah alias untukIFNULL
.
Fungsi tanggal dan waktu
Fungsi berikut memungkinkan manipulasi tanggal dan waktu untuk stempel waktu UNIX, string tanggal, dan jenis data TIMESTAMP. Untuk mengetahui informasi selengkapnya tentang cara menangani jenis data TIMESTAMP, lihat Menggunakan TIMESTAMP.
Fungsi tanggal dan waktu yang berfungsi dengan stempel waktu UNIX beroperasi pada waktu UNIX. Fungsi tanggal dan waktu menampilkan nilai berdasarkan zona waktu UTC.
Sintaks
Fungsi tanggal dan waktu | |
---|---|
CURRENT_DATE() |
Menampilkan tanggal saat ini dalam format %Y-%m-%d . |
CURRENT_TIME() |
Menampilkan waktu server saat ini dalam format %H:%M:%S . |
CURRENT_TIMESTAMP() |
Menampilkan waktu server saat ini dalam format %Y-%m-%d %H:%M:%S . |
DATE() |
Menampilkan tanggal dalam format %Y-%m-%d . |
DATE_ADD() |
Menambahkan interval yang ditentukan ke jenis data TIMESTAMP. |
DATEDIFF() |
Menampilkan jumlah hari antara dua jenis data TIMESTAMP. |
DAY() |
Menampilkan hari dalam sebulan sebagai bilangan bulat antara 1 dan 31. |
DAYOFWEEK() |
Menampilkan hari dalam seminggu sebagai bilangan bulat antara 1 (Minggu) dan 7 (Sabtu). |
DAYOFYEAR() |
Menampilkan hari dalam setahun sebagai bilangan bulat antara 1 dan 366. |
FORMAT_UTC_USEC() |
Menampilkan stempel waktu UNIX dalam format YYYY-MM-DD HH:MM:SS.uuuuuu . |
HOUR() |
Menampilkan jam pada TIMESTAMP sebagai bilangan bulat antara 0 dan 23. |
MINUTE() |
Menampilkan menit pada TIMESTAMP sebagai bilangan bulat antara 0 dan 59. |
MONTH() |
Menampilkan bulan pada TIMESTAMP sebagai bilangan bulat antara 1 dan 12. |
MSEC_TO_TIMESTAMP() |
Mengonversi stempel waktu UNIX dalam milidetik menjadi TIMESTAMP. |
NOW() |
Menampilkan stempel waktu UNIX saat ini dalam mikrodetik. |
PARSE_UTC_USEC() |
Mengonversi string tanggal menjadi stempel waktu UNIX dalam mikrodetik. |
QUARTER() |
Menampilkan kuartal dalam setahun pada TIMESTAMP sebagai bilangan bulat antara 1 dan 4. |
SEC_TO_TIMESTAMP() |
Mengonversi stempel waktu UNIX dalam detik menjadi TIMESTAMP. |
SECOND() |
Menampilkan detik pada TIMESTAMP sebagai bilangan bulat antara 0 dan 59. |
STRFTIME_UTC_USEC() |
Menampilkan string tanggal dalam format date_format_str. |
TIME() |
Menampilkan TIMESTAMP dalam format %H:%M:%S . |
TIMESTAMP() |
Mengonversi string tanggal menjadi TIMESTAMP. |
TIMESTAMP_TO_MSEC() |
Mengonversi TIMESTAMP menjadi stempel waktu UNIX dalam milidetik. |
TIMESTAMP_TO_SEC() |
Mengonversi TIMESTAMP menjadi stempel waktu UNIX dalam detik. |
TIMESTAMP_TO_USEC() |
Mengonversi TIMESTAMP menjadi stempel waktu UNIX dalam mikrodetik. |
USEC_TO_TIMESTAMP() |
Mengonversi stempel waktu UNIX dalam mikrodetik menjadi TIMESTAMP. |
UTC_USEC_TO_DAY() |
Menggeser stempel waktu UNIX dalam mikrodetik ke awal hari saat peristiwa terjadi. |
UTC_USEC_TO_HOUR() |
Menggeser stempel waktu UNIX dalam mikrodetik ke awal jam saat peristiwa terjadi. |
UTC_USEC_TO_MONTH() |
Menggeser stempel waktu UNIX dalam mikrodetik ke awal bulan saat peristiwa terjadi. |
UTC_USEC_TO_WEEK() |
Menampilkan stempel waktu UNIX dalam mikrodetik yang mewakili hari dalam seminggu. |
UTC_USEC_TO_YEAR() |
Menampilkan stempel waktu UNIX dalam mikrodetik yang mewakili tahun. |
WEEK() |
Menampilkan minggu pada TIMESTAMP sebagai bilangan bulat antara 1 dan 53. |
YEAR() |
Menampilkan tahun pada TIMESTAMP. |
CURRENT_DATE()
Menampilkan string tanggal saat ini yang dapat dibaca manusia dalam format
%Y-%m-%d
.Contoh:
SELECT CURRENT_DATE();
Hasil: 2013-02-01
CURRENT_TIME()
Menampilkan string waktu server saat ini yang dapat dibaca manusia dalam format
%H:%M:%S
.Contoh:
SELECT CURRENT_TIME();
Hasil: 01:32:56
CURRENT_TIMESTAMP()
Menampilkan jenis data TIMESTAMP dari waktu server saat ini dalam format
%Y-%m-%d %H:%M:%S
.Contoh:
SELECT CURRENT_TIMESTAMP();
Hasil: 2013-02-01 01:33:35 UTC
DATE(<timestamp>)
Menampilkan string jenis data TIMESTAMP yang dapat dibaca manusia dalam format
%Y-%m-%d
.Contoh:
SELECT DATE(TIMESTAMP('2012-10-01 02:03:04'));
Hasil: 2012-10-01
DATE_ADD(<timestamp>,<interval>,
<interval_units>)Menambahkan interval yang ditentukan ke jenis data TIMESTAMP. Nilai
interval_units
yang mungkin mencakupYEAR
,MONTH
,DAY
,HOUR
,MINUTE
, danSECOND
. Jikainterval
adalah angka negatif, interval akan dikurangi dari jenis data TIMESTAMP.Contoh:
SELECT DATE_ADD(TIMESTAMP("2012-10-01 02:03:04"), 5, "YEAR");
Hasil: 2017-10-01 02:03:04 UTC
SELECT DATE_ADD(TIMESTAMP("2012-10-01 02:03:04"), -5, "YEAR");
Hasil: 2007-10-01 02:03:04 UTC
DATEDIFF(<timestamp1>,<timestamp2>)
Menampilkan jumlah hari antara dua jenis data TIMESTAMP. Hasilnya positif jika jenis data TIMESTAMP pertama muncul setelah jenis data TIMESTAMP kedua. Jika kebalikannya, hasilnya akan negatif.
Contoh:
SELECT DATEDIFF(TIMESTAMP('2012-10-02 05:23:48'), TIMESTAMP('2011-06-24 12:18:35'));
Hasil: 466
Contoh:
SELECT DATEDIFF(TIMESTAMP('2011-06-24 12:18:35'), TIMESTAMP('2012-10-02 05:23:48'));
Hasil: -466
DAY(<timestamp>)
Menampilkan hari dalam sebulan dari jenis data TIMESTAMP sebagai bilangan bulat antara 1 dan 31, secara inklusif.
Contoh:
SELECT DAY(TIMESTAMP('2012-10-02 05:23:48'));
Hasil: 2
DAYOFWEEK(<timestamp>)
Menampilkan hari dalam seminggu dari jenis data TIMESTAMP sebagai bilangan bulat antara 1 (Minggu) dan 7 (Sabtu), secara inklusif.
Contoh:
SELECT DAYOFWEEK(TIMESTAMP("2012-10-01 02:03:04"));
Hasil: 2
DAYOFYEAR(<timestamp>)
Menampilkan hari dalam setahun dari jenis data TIMESTAMP sebagai bilangan bulat antara 1 dan 366, secara inklusif. Bilangan bulat 1 merujuk pada 1 Januari.
Contoh:
SELECT DAYOFYEAR(TIMESTAMP("2012-10-01 02:03:04"));
Hasil: 275
FORMAT_UTC_USEC(<unix_timestamp>)
Menampilkan representasi string stempel waktu UNIX yang dapat dibaca manusia dalam format
YYYY-MM-DD HH:MM:SS.uuuuuu
.Contoh:
SELECT FORMAT_UTC_USEC(1274259481071200);
Hasil: 2010-05-19 08:58:01.071200
HOUR(<timestamp>)
Menampilkan jam dari jenis data TIMESTAMP sebagai bilangan bulat antara 0 dan 23, secara inklusif.
Contoh:
SELECT HOUR(TIMESTAMP('2012-10-02 05:23:48'));
Hasil: 5
MINUTE(<timestamp>)
Menampilkan menit dari jenis data TIMESTAMP sebagai bilangan bulat antara 0 dan 59, secara inklusif.
Contoh:
SELECT MINUTE(TIMESTAMP('2012-10-02 05:23:48'));
Hasil: 23
MONTH(<timestamp>)
Menampilkan bulan dari jenis data TIMESTAMP sebagai bilangan bulat antara 1 dan 12, secara inklusif.
Contoh:
SELECT MONTH(TIMESTAMP('2012-10-02 05:23:48'));
Hasil: 10
MSEC_TO_TIMESTAMP(<expr>)
- Mengonversi stempel waktu UNIX dalam milidetik menjadi jenis data TIMESTAMP.
Contoh:
SELECT MSEC_TO_TIMESTAMP(1349053323000);
Hasil: 2012-10-01 01:02:03 UTC
SELECT MSEC_TO_TIMESTAMP(1349053323000 + 1000)
Hasil: 2012-10-01 01:02:04 UTC
NOW()
Menampilkan stempel waktu UNIX saat ini dalam mikrodetik.
Contoh:
SELECT NOW();
Hasil: 1359685811687920
PARSE_UTC_USEC(<date_string>)
-
Mengonversi string tanggal menjadi stempel waktu UNIX dalam mikrodetik.
date_string
harus memiliki formatYYYY-MM-DD HH:MM:SS[.uuuuuu]
. Bagian pecahan kedua dapat memiliki panjang hingga 6 digit atau dapat dihilangkan.TIMESTAMP_TO_USEC adalah fungsi setara yang mengonversi argumen jenis data TIMESTAMP, bukan string tanggal.
Contoh:
SELECT PARSE_UTC_USEC("2012-10-01 02:03:04");
Hasil: 1349056984000000
QUARTER(<timestamp>)
Menampilkan kuartal dalam setahun dari jenis data TIMESTAMP sebagai bilangan bulat antara 1 dan 4, secara inklusif.
Contoh:
SELECT QUARTER(TIMESTAMP("2012-10-01 02:03:04"));
Hasil: 4
SEC_TO_TIMESTAMP(<expr>)
Mengonversi stempel waktu UNIX dalam detik menjadi jenis data TIMESTAMP.
Contoh:
SELECT SEC_TO_TIMESTAMP(1355968987);
Hasil: 2012-12-20 02:03:07 UTC
SELECT SEC_TO_TIMESTAMP(INTEGER(1355968984 + 3));
Hasil: 2012-12-20 02:03:07 UTC
SECOND(<timestamp>)
-
Menampilkan detik dari jenis data TIMESTAMP sebagai bilangan bulat antara 0 dan 59, secara inklusif.
Selama detik kabisat, rentang bilangan bulat adalah antara 0 dan 60, secara inklusif.
Contoh:
SELECT SECOND(TIMESTAMP('2012-10-02 05:23:48'));
Hasil: 48
STRFTIME_UTC_USEC(<unix_timestamp>,
<date_format_str>)-
Menampilkan string tanggal yang dapat dibaca manusia dalam format date_format_str. date_format_str dapat menyertakan karakter tanda baca yang terkait dengan tanggal (seperti / dan -) serta karakter khusus yang diterima oleh fungsi strftime dalam bahasa C++ (seperti %d untuk hari dalam sebulan).
Gunakan fungsi
UTC_USEC_TO_<function_name>
jika Anda berencana untuk mengelompokkan data kueri berdasarkan interval waktu, seperti mendapatkan semua data untuk bulan tertentu, karena fungsinya lebih efisien.Contoh:
SELECT STRFTIME_UTC_USEC(1274259481071200, "%Y-%m-%d");
Hasil: 2010-05-19
TIME(<timestamp>)
Menampilkan string jenis data TIMESTAMP yang dapat dibaca manusia dalam format
%H:%M:%S
.Contoh:
SELECT TIME(TIMESTAMP('2012-10-01 02:03:04'));
Hasil: 02:03:04
TIMESTAMP(<date_string>)
Mengonversi string tanggal menjadi jenis data TIMESTAMP.
Contoh:
SELECT TIMESTAMP("2012-10-01 01:02:03");
Hasil: 2012-10-01 01:02:03 UTC
TIMESTAMP_TO_MSEC(<timestamp>)
Mengonversi jenis data TIMESTAMP ke stempel waktu UNIX dalam milidetik.
Contoh:
SELECT TIMESTAMP_TO_MSEC(TIMESTAMP("2012-10-01 01:02:03"));
Hasil: 1349053323000
TIMESTAMP_TO_SEC(<timestamp>)
- Mengonversi jenis data TIMESTAMP menjadi stempel waktu UNIX dalam detik.
Contoh:
SELECT TIMESTAMP_TO_SEC(TIMESTAMP("2012-10-01 01:02:03"));
Hasil: 1349053323
TIMESTAMP_TO_USEC(<timestamp>)
-
Mengonversi jenis data TIMESTAMP menjadi stempel waktu UNIX dalam mikrodetik.
PARSE_UTC_USEC adalah fungsi padanan yang mengonversi argumen string data, bukan jenis data TIMESTAMP.
Contoh:
SELECT TIMESTAMP_TO_USEC(TIMESTAMP("2012-10-01 01:02:03"));
Hasil: 1349053323000000
USEC_TO_TIMESTAMP(<expr>)
Mengonversi stempel waktu UNIX dalam mikrodetik menjadi jenis data TIMESTAMP.
Contoh:
SELECT USEC_TO_TIMESTAMP(1349053323000000);
Hasil: 2012-10-01 01:02:03 UTC
SELECT USEC_TO_TIMESTAMP(1349053323000000 + 1000000)
Hasil: 2012-10-01 01:02:04 UTC
UTC_USEC_TO_DAY(<unix_timestamp>)
-
Menggeser stempel waktu UNIX dalam mikrodetik ke awal hari saat peristiwa terjadi.
Misalnya, jika
unix_timestamp
terjadi pada 19 Mei pukul 08.58, fungsi ini akan menampilkan stempel waktu UNIX untuk 19 Mei pukul 00:00 (tengah malam).Contoh:
SELECT UTC_USEC_TO_DAY(1274259481071200);
Hasil: 1274227200000000
UTC_USEC_TO_HOUR(<unix_timestamp>)
-
Menggeser stempel waktu UNIX dalam mikrodetik ke awal jam saat peristiwa terjadi.
Misalnya, jika
unix_timestamp
terjadi pada pukul 08.58, fungsi ini akan menampilkan stempel waktu UNIX untuk pukul 08:00 pada hari yang sama.Contoh:
SELECT UTC_USEC_TO_HOUR(1274259481071200);
Hasil: 1274256000000000
UTC_USEC_TO_MONTH(<unix_timestamp>)
-
Menggeser stempel waktu UNIX dalam mikrodetik ke awal bulan saat peristiwa terjadi.
Misalnya, jika
unix_timestamp
terjadi pada 19 Maret, fungsi ini akan menampilkan stempel waktu UNIX untuk 1 Maret pada tahun yang sama.Contoh:
SELECT UTC_USEC_TO_MONTH(1274259481071200);
Hasil: 1272672000000000
UTC_USEC_TO_WEEK(<unix_timestamp>,
<day_of_week>)-
Menampilkan stempel waktu UNIX dalam mikrodetik yang mewakili hari dalam seminggu dari argumen
unix_timestamp
. Fungsi ini menggunakan dua argumen: stempel waktu UNIX dalam mikrodetik, dan hari dalam seminggu dari 0 (Minggu) hingga 6 (Sabtu).Misalnya, jika
unix_timestamp
terjadi pada hari Jumat, 11-04-2008, dan Anda menetapkanday_of_week
ke 2 (Selasa), fungsi ini akan menampilkan stempel waktu UNIX untuk hari Selasa, 08-04-2008.Contoh:
SELECT UTC_USEC_TO_WEEK(1207929480000000, 2) AS tuesday;
Hasil: 1207612800000000
UTC_USEC_TO_YEAR(<unix_timestamp>)
-
Menampilkan stempel waktu UNIX dalam mikrodetik yang mewakili tahun dari argumen
unix_timestamp
.Misalnya, jika
unix_timestamp
terjadi pada tahun 2010, fungsi akan menampilkan1274259481071200
, yang merupakan representasi mikrodetik dari2010-01-01 00:00
.Contoh:
SELECT UTC_USEC_TO_YEAR(1274259481071200);
Hasil: 1262304000000000
WEEK(<timestamp>)
Menampilkan minggu dari jenis data TIMESTAMP sebagai bilangan bulat antara 1 dan 53, secara inklusif.
Minggu dimulai pada hari Minggu, sehingga jika 1 Januari adalah hari selain Minggu, minggu ke-1 memiliki kurang dari 7 hari, dan Minggu pertama dalam setiap tahun adalah hari pertama minggu ke-2.
Contoh:
SELECT WEEK(TIMESTAMP('2014-12-31'));
Hasil: 53
YEAR(<timestamp>)
- Menampilkan tahun dari jenis data TIMESTAMP.
Contoh:
SELECT YEAR(TIMESTAMP('2012-10-02 05:23:48'));
Hasil: 2012
Contoh lanjutan
-
Mengonversi hasil stempel waktu bilangan bulat menjadi format yang dapat dibaca manusia
Kueri berikut menemukan 5 momen teratas saat revisi Wikipedia paling banyak terjadi. Untuk menampilkan hasil dalam format yang dapat dibaca manusia, gunakan fungsi
FORMAT_UTC_USEC()
BigQuery, yang mengambil stempel waktu, dalam mikrodetik, sebagai input. Kueri ini mengalikan stempel waktu format POSIX Wikipedia (dalam detik) dengan 1.000.000 untuk mengonversi nilainya menjadi mikrodetik.Contoh:
#legacySQL SELECT /* Multiply timestamp by 1000000 and convert */ /* into a more human-readable format. */ TOP (FORMAT_UTC_USEC(timestamp * 1000000), 5) AS top_revision_time, COUNT (*) AS revision_count FROM [bigquery-public-data:samples.wikipedia];
Hasil:
+----------------------------+----------------+ | top_revision_time | revision_count | +----------------------------+----------------+ | 2002-02-25 15:51:15.000000 | 20976 | | 2002-02-25 15:43:11.000000 | 15974 | | 2010-02-02 03:34:51.000000 | 3 | | 2010-02-02 01:04:59.000000 | 3 | | 2010-02-01 23:55:05.000000 | 3 | +----------------------------+----------------+
-
Mengelompokkan Hasil berdasarkan Stempel Waktu
Sebaiknya gunakan fungsi tanggal dan waktu untuk mengelompokkan hasil kueri ke dalam bucket yang sesuai dengan tahun, bulan, atau hari tertentu. Contoh berikut menggunakan fungsi
UTC_USEC_TO_MONTH()
untuk menampilkan jumlah karakter yang digunakan setiap kontributor Wikipedia dalam komentar revisi mereka per bulan.Contoh:
#legacySQL SELECT contributor_username, /* Return the timestamp shifted to the * start of the month, formatted in * a human-readable format. Uses the * 'LEFT()' string function to return only * the first 7 characters of the formatted timestamp. */ LEFT (FORMAT_UTC_USEC( UTC_USEC_TO_MONTH(timestamp * 1000000)),7) AS month, SUM(LENGTH(comment)) as total_chars_used FROM [bigquery-public-data:samples.wikipedia] WHERE (contributor_username != '' AND contributor_username IS NOT NULL) AND timestamp > 1133395200 AND timestamp < 1157068800 GROUP BY contributor_username, month ORDER BY total_chars_used DESC;
Hasil (terpotong):
+--------------------------------+---------+-----------------------+ | contributor_username | month | total_chars_used | +--------------------------------+---------+-----------------------+ | Kingbotk | 2006-08 | 18015066 | | SmackBot | 2006-03 | 7838365 | | SmackBot | 2006-05 | 5148863 | | Tawkerbot2 | 2006-05 | 4434348 | | Cydebot | 2006-06 | 3380577 | etc ...
Fungsi IP
Fungsi IP mengonversi alamat IP ke dan dari bentuk yang dapat dibaca manusia.
Sintaks
Fungsi IP | |
---|---|
FORMAT_IP() |
Mengonversi 32 bit integer_value yang paling tidak signifikan menjadi string alamat IPv4 yang dapat dibaca manusia. |
PARSE_IP() |
Mengonversi string yang mewakili alamat IPv4 menjadi nilai bilangan bulat yang tidak bertanda tangan. |
FORMAT_PACKED_IP() |
Menampilkan alamat IP yang dapat dibaca manusia dalam bentuk 10.1.5.23 atau 2620:0:1009:1:216:36ff:feef:3f . |
PARSE_PACKED_IP() |
Menampilkan alamat IP dalam BYTES. |
FORMAT_IP(integer_value)
- Mengonversi 32 bit
integer_value
paling tidak signifikan menjadi string alamat IPv4 yang dapat dibaca manusia. Misalnya,FORMAT_IP(1)
akan menampilkan string'0.0.0.1'
. PARSE_IP(readable_ip)
- Mengonversi string yang mewakili alamat IPv4 menjadi nilai bilangan bulat yang tidak bertanda tangan. Misalnya,
PARSE_IP('0.0.0.1')
akan menampilkan1
. Jika string bukan alamat IPv4 yang valid,PARSE_IP
akan menampilkanNULL
.
BigQuery mendukung penulisan alamat IPv4 dan IPv6 dalam string yang dikemas, sebagai data biner 4 atau 16 byte dalam urutan byte jaringan. Fungsi yang dijelaskan di bawah mendukung penguraian alamat ke dan dari bentuk yang dapat dibaca manusia. Fungsi ini hanya berfungsi pada kolom string dengan IP.
Sintaks
FORMAT_PACKED_IP(packed_ip)
Menampilkan alamat IP yang dapat dibaca manusia, dalam bentuk
10.1.5.23
atau2620:0:1009:1:216:36ff:feef:3f
. Contoh:-
FORMAT_PACKED_IP('0123456789@ABCDE')
akan menampilkan'3031:3233:3435:3637:3839:4041:4243:4445'
FORMAT_PACKED_IP('0123')
akan menampilkan'48.49.50.51'
-
PARSE_PACKED_IP(readable_ip)
Menampilkan alamat IP dalam BYTES. Jika string input bukan alamat IPv4 atau IPv6 yang valid,
PARSE_PACKED_IP
akan menampilkanNULL
. Contoh:PARSE_PACKED_IP('48.49.50.51')
akan menampilkan'MDEyMw=='
PARSE_PACKED_IP('3031:3233:3435:3637:3839:4041:4243:4445')
akan menampilkan'MDEyMzQ1Njc4OUBBQkNERQ=='
Fungsi JSON
Fungsi JSON BigQuery memberi Anda kemampuan untuk menemukan nilai dalam data JSON yang tersimpan, menggunakan ekspresi seperti JSONPath.
Menyimpan data JSON dapat lebih fleksibel daripada mendeklarasikan semua kolom individual dalam skema tabel, tetapi dapat menyebabkan biaya yang lebih tinggi. Saat memilih data dari string JSON, Anda akan dikenai biaya untuk pemindaian seluruh string, yang lebih mahal dibandingkan jika setiap kolom berada dalam kolom terpisah. Kueri juga lebih lambat karena seluruh string perlu diurai pada waktu kueri. Namun, untuk skema ad-hoc atau yang cepat berubah, fleksibilitas JSON sepadan dengan biaya tambahannya.
Jika bekerja dengan data terstruktur, gunakan fungsi JSON, bukan fungsi ekspresi reguler BigQuery, karena fungsi JSON lebih mudah digunakan.
Sintaks
Fungsi JSON | |
---|---|
JSON_EXTRACT() |
Memilih nilai berdasarkan ekspresi JSONPath dan menampilkan string JSON. |
JSON_EXTRACT_SCALAR() |
Memilih nilai berdasarkan ekspresi JSONPath dan menampilkan skalar JSON. |
JSON_EXTRACT(json, json_path)
-
Memilih nilai di
json
sesuai dengan ekspresi JSONPathjson_path
.json_path
harus berupa konstanta string. Menampilkan nilai dalam format string JSON. JSON_EXTRACT_SCALAR(json, json_path)
-
Memilih nilai di
json
sesuai dengan ekspresi JSONPathjson_path
.json_path
harus berupa konstanta string. Menampilkan nilai JSON skalar.
Operator logika
Operator logika menjalankan logika biner atau ternary pada ekspresi. Logika biner menampilkan true
atau false
. Logika ternary mengakomodasi nilai NULL
dan menampilkan true
, false
, atau NULL
.
Sintaks
Operator logika | |
---|---|
expr AND expr |
Menampilkan true jika kedua ekspresi benar. |
expr OR expr |
Menampilkan true jika salah satu atau kedua ekspresi benar. |
NOT expr |
Menampilkan true jika ekspresi salah. |
expr AND expr
- Menampilkan
true
jika kedua ekspresi benar. - Menampilkan
false
jika salah satu atau kedua ekspresi salah. - Menampilkan
NULL
jika kedua ekspresi adalah NULL atau satu ekspresi benar dan ekspresi lainnya adalah NULL.
- Menampilkan
expr OR expr
- Menampilkan
true
jika salah satu atau kedua ekspresi benar. - Menampilkan
false
jika kedua ekspresi salah. - Menampilkan
NULL
jika kedua ekspresi adalah NULL, atau satu ekspresi salah dan ekspresi lainnya adalah NULL.
- Menampilkan
NOT expr
- Menampilkan
true
jika ekspresi salah. - Menampilkan
false
jika ekspresi jika benar. - Menampilkan
NULL
jika ekspresi adalah NULL.
Anda dapat menggunakan
NOT
dengan fungsi lain sebagai operator negasi. Misalnya,NOT IN(expr1, expr2)
atauIS NOT NULL
.- Menampilkan
Fungsi matematika
Fungsi matematika mengambil argumen numerik dan menampilkan hasil numerik. Setiap argumen dapat berupa literal numerik atau nilai numerik yang ditampilkan oleh kueri. Jika fungsi matematika bernilai hasil yang tidak ditentukan, operasi akan menampilkan NULL
.
Sintaks
Fungsi matematika | |
---|---|
ABS() |
Menampilkan nilai absolut dari argumen. |
ACOS() |
Menampilkan kosinus terbalik dari argumen. |
ACOSH() |
Menampilkan kosinus hiperbolik terbalik dari argumen. |
ASIN() |
Menampilkan sinus terbalik dari argumen. |
ASINH() |
Menampilkan sinus hiperbolik terbalik dari argumen. |
ATAN() |
Menampilkan tangen terbalik dari argumen. |
ATANH() |
Menampilkan tangen hiperbolik terbalik dari argumen. |
ATAN2() |
Menampilkan tangen terbalik dari kedua argumen. |
CEIL() |
Membulatkan argumen ke atas ke bilangan bulat terdekat dan menampilkan nilai yang dibulatkan. |
COS() |
Menampilkan kosinus dari argumen. |
COSH() |
Menampilkan kosinus hiperbolik dari argumen. |
DEGREES() |
Mengonversi dari radian ke derajat. |
EXP() |
Menampilkan e pangkat dari argumen. |
FLOOR() |
Membulatkan argumen ke bawah ke bilangan bulat terdekat. |
LN() LOG()
|
Menampilkan logaritma natural dari argumen. |
LOG2() |
Menampilkan logaritma basis 2 dari argumen. |
LOG10() |
Menampilkan logaritma basis 10 dari argumen. |
PI() |
Menampilkan konstanta π. |
POW() |
Menampilkan argumen pertama pangkat argumen kedua. |
RADIANS() |
Mengonversi dari derajat ke radian. |
RAND() |
Menampilkan nilai float acak dalam rentang 0,0 <= nilai < 1,0. |
ROUND() |
Membulatkan argumen ke atas atau ke bawah ke bilangan bulat terdekat. |
SIN() |
Menampilkan sinus dari argumen. |
SINH() |
Menampilkan sinus hiperbolik dari argumen. |
SQRT() |
Menampilkan akar kuadrat dari ekspresi. |
TAN() |
Menampilkan tangen dari argumen. |
TANH() |
Menampilkan tangen hiperbolik dari argumen. |
ABS(numeric_expr)
- Menampilkan nilai absolut argumen.
ACOS(numeric_expr)
- Menampilkan kosinus terbalik dari argumen.
ACOSH(numeric_expr)
- Menampilkan kosinus hiperbolik terbalik dari argumen.
ASIN(numeric_expr)
- Menampilkan sinus terbalik dari argumen.
ASINH(numeric_expr)
- Menampilkan sinus hiperbolik terbalik dari argumen.
ATAN(numeric_expr)
- Menampilkan tangen terbalik dari argumen.
ATANH(numeric_expr)
- Menampilkan tangen hiperbolik terbalik dari argumen.
ATAN2(numeric_expr1, numeric_expr2)
- Menampilkan tangen terbalik dari kedua argumen.
CEIL(numeric_expr)
- Membulatkan argumen ke atas ke bilangan bulat terdekat dan menampilkan nilai yang dibulatkan.
COS(numeric_expr)
- Menampilkan kosinus dari argumen.
COSH(numeric_expr)
- Menampilkan kosinus hiperbolik dari argumen.
DEGREES(numeric_expr)
- Menampilkan
numeric_expr
, yang dikonversi dari radian ke derajat. EXP(numeric_expr)
- Menampilkan hasil pemangkatan konstanta "e" - basis logaritma natural - ke pangkat numeric_expr.
FLOOR(numeric_expr)
- Membulatkan argumen ke bawah ke bilangan bulat terdekat dan menampilkan nilai yang dibulatkan.
LN(numeric_expr)
LOG(numeric_expr)
- Menampilkan logaritma natural dari argumen.
LOG2(numeric_expr)
- Menampilkan logaritma basis 2 dari argumen.
LOG10(numeric_expr)
- Menampilkan logaritma basis 10 dari argumen.
PI()
- Menampilkan konstanta π. Fungsi
PI()
memerlukan tanda kurung untuk menunjukkan bahwa itu adalah sebuah fungsi, tetapi tidak membutuhkan argumen dalam tanda kurung tersebut. Anda dapat menggunakanPI()
seperti konstanta dengan fungsi matematika dan aritmetika. POW(numeric_expr1, numeric_expr2)
- Menampilkan hasil pemangkatan
numeric_expr1
pangkatnumeric_expr2
. RADIANS(numeric_expr)
- Menampilkan
numeric_expr
, yang dikonversi dari derajat ke radian. (Perhatikan bahwa π radian sama dengan 180 derajat.) RAND([int32_seed])
- Menampilkan nilai float acak dalam rentang 0,0 <= nilai < 1,0. Setiap nilai
int32_seed
selalu menghasilkan urutan angka acak yang sama dalam kueri tertentu, selama Anda tidak menggunakan klausaLIMIT
. Jikaint32_seed
tidak ditentukan, BigQuery akan menggunakan stempel waktu saat ini sebagai nilai seed. ROUND(numeric_expr [, digits])
- Membulatkan argumen ke atas atau ke bawah ke bilangan bulat terdekat (atau jika ditentukan, ke jumlah digit tertentu) dan menampilkan nilai yang dibulatkan.
SIN(numeric_expr)
- Menampilkan sinus dari argumen.
SINH(numeric_expr)
- Menampilkan sinus hiperbolik dari argumen.
SQRT(numeric_expr)
- Menampilkan akar kuadrat dari ekspresi.
TAN(numeric_expr)
- Menampilkan tangen dari argumen.
TANH(numeric_expr)
- Menampilkan tangen hiperbolik dari argumen.
Contoh lanjutan
-
Kueri kotak pembatas
Kueri berikut menampilkan kumpulan titik dalam kotak pembatas persegi panjang yang berpusat di San Francisco (37.46, -122.50).
Contoh:
#legacySQL SELECT year, month, AVG(mean_temp) avg_temp, MIN(min_temperature) min_temp, MAX(max_temperature) max_temp FROM [weather_geo.table] WHERE /* Return values between a pair of */ /* latitude and longitude coordinates */ lat / 1000 > 37.46 AND lat / 1000 < 37.65 AND long / 1000 > -122.50 AND long / 1000 < -122.30 GROUP BY year, month ORDER BY year, month ASC;
-
Perkiraan Kueri Lingkaran Pembatas
Menampilkan kumpulan hingga 100 titik dalam perkiraan lingkaran yang ditentukan menggunakan Spherical Law of Cosines, yang berpusat di Denver, Colorado (39,73, -104,98). Kueri ini menggunakan fungsi matematika dan trigonometri BigQuery, seperti
PI()
,SIN()
, danCOS()
.Karena Bumi tidak berbentuk bulat absolut, dan bujur+lintang bertemu di kutub, kueri ini menampilkan perkiraan yang dapat berguna untuk berbagai jenis data.
Contoh:
#legacySQL SELECT distance, lat, long, temp FROM (SELECT ((ACOS(SIN(39.73756700 * PI() / 180) * SIN((lat/1000) * PI() / 180) + COS(39.73756700 * PI() / 180) * COS((lat/1000) * PI() / 180) * COS((-104.98471790 - (long/1000)) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance, AVG(mean_temp) AS temp, AVG(lat/1000) lat, AVG(long/1000) long FROM [weather_geo.table] WHERE month=1 GROUP BY distance) WHERE distance < 100 ORDER BY distance ASC LIMIT 100;
Fungsi ekspresi reguler
BigQuery menyediakan dukungan ekspresi reguler menggunakan library re2; lihat dokumentasi tersebut untuk mengetahui sintaksis ekspresi regulernya.
Perhatikan bahwa ekspresi reguler adalah pencocokan global. Untuk mulai mencocokkan di awal kata, Anda harus menggunakan karakter ^.
Sintaks
Fungsi ekspresi reguler | |
---|---|
REGEXP_MATCH() |
Menampilkan true jika argumen cocok dengan ekspresi reguler. |
REGEXP_EXTRACT() |
Menampilkan bagian argumen yang cocok dengan grup tangkapan dalam ekspresi reguler. |
REGEXP_REPLACE() |
Menggantikan substring yang cocok dengan ekspresi reguler. |
REGEXP_MATCH('str', 'reg_exp')
Menampilkan true jika str cocok dengan ekspresi reguler. Untuk pencocokan string tanpa ekspresi reguler, gunakan CONTAINS, bukan REGEXP_MATCH.
Contoh:
#legacySQL SELECT word, COUNT(word) AS count FROM [bigquery-public-data:samples.shakespeare] WHERE (REGEXP_MATCH(word,r'\w\w\'\w\w')) GROUP BY word ORDER BY count DESC LIMIT 3;
Hasil:
+-------+-------+ | word | count | +-------+-------+ | ne'er | 42 | | we'll | 35 | | We'll | 33 | +-------+-------+
REGEXP_EXTRACT('str', 'reg_exp')
Menampilkan bagian str yang cocok dengan grup tangkapan dalam ekspresi reguler.
Contoh:
#legacySQL SELECT REGEXP_EXTRACT(word,r'(\w\w\'\w\w)') AS fragment FROM [bigquery-public-data:samples.shakespeare] GROUP BY fragment ORDER BY fragment LIMIT 3;
Hasil:
+----------+ | fragment | +----------+ | NULL | | Al'ce | | As'es | +----------+
REGEXP_REPLACE('orig_str', 'reg_exp', 'replace_str')
Menampilkan string dengan setiap substring orig_str yang cocok dengan reg_exp diganti dengan replace_str. Misalnya, REGEXP_REPLACE ('Hello', 'lo', 'p') akan menampilkan Help.
Contoh:
#legacySQL SELECT REGEXP_REPLACE(word, r'ne\'er', 'never') AS expanded_word FROM [bigquery-public-data:samples.shakespeare] WHERE REGEXP_MATCH(word, r'ne\'er') GROUP BY expanded_word ORDER BY expanded_word LIMIT 5;
Hasil:
+---------------+ | expanded_word | +---------------+ | Whenever | | never | | nevertheless | | whenever | +---------------+
Contoh lanjutan
-
Memfilter hasil yang ditetapkan oleh pencocokan ekspresi reguler
Fungsi ekspresi reguler BigQuery dapat digunakan untuk memfilter hasil dalam klausa
WHERE
, serta untuk menampilkan hasil dalamSELECT
. Contoh berikut menggabungkan kedua kasus penggunaan ekspresi reguler ke dalam satu kueri.Contoh:
#legacySQL SELECT /* Replace white spaces in the title with underscores. */ REGEXP_REPLACE(title, r'\s+', '_') AS regexp_title, revisions FROM (SELECT title, COUNT(revision_id) as revisions FROM [bigquery-public-data:samples.wikipedia] WHERE wp_namespace=0 /* Match titles that start with 'G', end with * 'e', and contain at least two 'o's. */ AND REGEXP_MATCH(title, r'^G.*o.*o.*e$') GROUP BY title ORDER BY revisions DESC LIMIT 100);
-
Menggunakan ekspresi reguler pada data float atau bilangan bulat
Meskipun fungsi ekspresi reguler BigQuery hanya berfungsi untuk data string, fungsi
STRING()
dapat digunakan untuk mentransmisikan data bilangan bulat atau data float ke dalam format string. Dalam contoh ini,STRING()
digunakan untuk mentransmisikan nilai bilangan bulatcorpus_date
ke string, yang kemudian diubah olehREGEXP_REPLACE
.Contoh:
#legacySQL SELECT corpus_date, /* Cast the corpus_date to a string value */ REGEXP_REPLACE(STRING(corpus_date), '^16', 'Written in the sixteen hundreds, in the year \'' ) AS date_string FROM [bigquery-public-data:samples.shakespeare] /* Cast the corpus_date to string, */ /* match values that begin with '16' */ WHERE REGEXP_MATCH(STRING(corpus_date), '^16') GROUP BY corpus_date, date_string ORDER BY date_string DESC LIMIT 5;
Fungsi string
Fungsi string beroperasi pada data string. Konstanta string harus diapit oleh tanda kutip tunggal atau ganda. Fungsi string peka huruf besar/kecil secara default.
Anda dapat menambahkan IGNORE CASE
ke akhir kueri untuk mengaktifkan pencocokan yang tidak peka huruf besar/kecil. IGNORE CASE
hanya berfungsi pada karakter ASCII dan hanya pada tingkat teratas kueri.
Karakter pengganti tidak didukung dalam fungsi ini. Untuk mengetahui fungsi ekspresi reguler, lihat bagian fungsi ekspresi reguler.
Sintaks
Fungsi string | |
---|---|
CONCAT() |
Menampilkan penggabungan dua string atau lebih, atau NULL jika salah satu nilainya adalah NULL. |
expr CONTAINS 'str' |
Menampilkan true jika expr berisi argumen string yang ditentukan. |
INSTR() |
Menampilkan indeks berbasis satu dari kemunculan pertama string. |
LEFT() |
Menampilkan karakter paling kiri dari string. |
LENGTH() |
Menampilkan panjang string. |
LOWER() |
Menampilkan string asli dengan semua karakter dalam huruf kecil. |
LPAD() |
Menyisipkan karakter di sebelah kiri string. |
LTRIM() |
Menghapus karakter dari sisi kiri string. |
REPLACE() |
Mengganti semua kemunculan substring. |
RIGHT() |
Menampilkan karakter paling kanan dari string. |
RPAD() |
Menyisipkan karakter ke sisi kanan string. |
RTRIM() |
Menghapus karakter di akhir dari sisi kanan string. |
SPLIT() |
Memisahkan string menjadi beberapa substring berulang. |
SUBSTR() |
Menampilkan substring ... |
UPPER() |
Menampilkan string asli dengan semua karakter dalam huruf besar. |
CONCAT('str1', 'str2', '...')
str1 + str2 + ...- Menampilkan penggabungan dua string atau lebih, atau NULL jika salah satu nilainya NULL. Contoh: jika
str1
adalahJava
danstr2
adalahScript
,CONCAT
akan menampilkanJavaScript
. expr CONTAINS 'str'
- Menampilkan
true
jikaexpr
berisi argumen string yang ditentukan. Perbandingan ini peka huruf besar/kecil. INSTR('str1', 'str2')
- Menampilkan indeks berbasis satu dari kemunculan str2 pertama di str1, atau menampilkan 0 jika str2 tidak muncul di str1.
LEFT('str', numeric_expr)
- Menampilkan karakter numerik_expr paling kiri dari
str
. Jika angkanya lebih panjang dari str, string lengkap akan ditampilkan. Contoh:LEFT('seattle', 3)
akan menampilkansea
. LENGTH('str')
- Menampilkan nilai numerik untuk panjang string. Contoh: jika
str
adalah'123456'
,LENGTH
akan menampilkan6
. LOWER('str')
- Menampilkan string asli dengan semua karakter dalam huruf kecil.
LPAD('str1', numeric_expr, 'str2')
- Mengisi
str1
di sebelah kiri denganstr2
, mengulangistr2
hingga string hasil tepatnumeric_expr
karakter. Contoh:LPAD('1', 7, '?')
akan menampilkan??????1
. LTRIM('str1' [, str2])
-
Menghapus karakter dari sisi kiri str1. Jika str2 dihilangkan,
LTRIM
akan menghapus spasi dari sisi kiri str1. Jika tidak,LTRIM
akan menghapus karakter apa pun dalam str2 dari sisi kiri str1 (peka huruf besar/kecil).Contoh:
SELECT LTRIM("Say hello", "yaS")
akan menampilkan" hello"
.SELECT LTRIM("Say hello", " ySa")
akan menampilkan"hello"
. REPLACE('str1', 'str2', 'str3')
-
Mengganti semua hasil temuan dari str2 dalam str1 dengan str3.
RIGHT('str', numeric_expr)
- Menampilkan karakter numerik_expr paling kanan dari
str
. Jika angkanya lebih panjang dari string, fungsi ini akan menampilkan seluruh string. Contoh:RIGHT('kirkland', 4)
akan menampilkanland
. RPAD('str1', numeric_expr, 'str2')
- Mengisi
str1
di sebelah kanan denganstr2
, mengulangistr2
hingga string hasil tepatnumeric_expr
karakter. Contoh:RPAD('1', 7, '?')
akan menampilkan1??????
. RTRIM('str1' [, str2])
-
Menghapus karakter di akhir dari sisi kanan str1. Jika str2 dihilangkan,
RTRIM
akan menghapus spasi di akhir dari str1. Jika tidak,RTRIM
akan menghapus karakter apa pun dalam str2 dari sisi kanan str1 (peka huruf besar/kecil).Contoh:
SELECT RTRIM("Say hello", "leo")
akan menampilkan"Say h"
.SELECT RTRIM("Say hello ", " hloe")
akan menampilkan"Say"
. SPLIT('str' [, 'delimiter'])
- Membagi string menjadi beberapa substring berulang. Jika
delimiter
ditentukan, fungsiSPLIT
akan membagistr
menjadi substring, menggunakandelimiter
sebagai pembatas. SUBSTR('str', index [, max_len])
- Menampilkan substring
str
, mulai dariindex
. Jika parametermax_len
opsional digunakan, panjang string yang ditampilkan maksimalmax_len
karakter. Penghitungan dimulai dari 1, jadi karakter pertama dalam string berada di posisi 1 (bukan nol). Jikaindex
adalah5
, substring dimulai dengan karakter ke-5 dari kiri padastr
. Jikaindex
adalah-4
, substring dimulai dengan karakter ke-4 dari kanan padastr
. Contoh:SUBSTR('awesome', -4, 4)
akan menampilkan substringsome
. UPPER('str')
- Menampilkan string asli dengan semua karakter dalam huruf besar.
Meng-escape karakter khusus dalam string
Untuk meng-escape karakter khusus, gunakan salah satu metode berikut:
- Gunakan notasi
'\xDD'
, dengan'\x'
diikuti dengan representasi heksadesimal dua digit dari karakter tersebut. - Gunakan garis miring escape di depan garis miring, tanda kutip tunggal, dan tanda kutip ganda.
- Gunakan urutan gaya C (
'\a', '\b', '\f', '\n', '\r', '\t',
dan'\v'
) untuk karakter lainnya.
Berikut beberapa contoh escape:
'this is a space: \x20'
'this string has \'single quote\' inside it'
'first line \n second line'
"double quotes are also ok"
'\070' -> ERROR: octal escaping is not supported
Fungsi karakter pengganti tabel
Fungsi karakter pengganti tabel adalah cara yang mudah untuk membuat kueri data dari kumpulan tabel tertentu. Fungsi karakter pengganti tabel setara dengan gabungan yang dipisahkan koma untuk semua tabel yang cocok dengan fungsi karakter pengganti. Jika Anda menggunakan fungsi karakter pengganti pada tabel, BigQuery hanya akan mengakses dan mengenakan biaya untuk tabel yang cocok dengan karakter pengganti tersebut. Fungsi karakter pengganti tabel ditentukan dalam klausa FROM kueri.
Jika Anda menggunakan fungsi karakter pengganti tabel dalam kueri, fungsi tersebut tidak perlu lagi berada di dalam tanda kurung. Misalnya, sebagian contoh berikut menggunakan tanda kurung, sedangkan yang lainnya tidak.
Hasil yang disimpan dalam cache tidak didukung untuk kueri terhadap beberapa tabel yang menggunakan fungsi karakter pengganti (meskipun jika opsi Use Cached Results dicentang). Jika menjalankan kueri karakter pengganti yang sama beberapa kali, Anda akan ditagih untuk setiap kueri.
Sintaks
Fungsi karakter pengganti tabel | |
---|---|
TABLE_DATE_RANGE() |
Membuat kueri beberapa tabel harian yang mencakup rentang tanggal. |
TABLE_DATE_RANGE_STRICT() |
Membuat kueri beberapa tabel harian yang mencakup rentang tanggal, tanpa tanggal yang hilang. |
TABLE_QUERY() |
Membuat kueri tabel yang namanya cocok dengan predikat yang ditentukan. |
TABLE_DATE_RANGE(prefix, timestamp1, timestamp2)
-
Membuat kueri tabel harian yang tumpang tindih dengan rentang waktu antara
<timestamp1>
dan<timestamp2>
.Nama tabel harus memiliki format berikut:
<prefix><day>
, dengan<day>
dalam formatYYYYMMDD
.Anda dapat menggunakan fungsi tanggal dan waktu untuk menghasilkan parameter stempel waktu. Contoh:
TIMESTAMP('2012-10-01 02:03:04')
DATE_ADD(CURRENT_TIMESTAMP(), -7, 'DAY')
Contoh: dapatkan tabel antara dua hari
Contoh ini mengasumsikan bahwa tabel berikut ada:
- mydata.people20140325
- mydata.people20140326
- mydata.people20140327
#legacySQL SELECT name FROM TABLE_DATE_RANGE([myproject-1234:mydata.people], TIMESTAMP('2014-03-25'), TIMESTAMP('2014-03-27')) WHERE age >= 35
Cocok dengan tabel berikut:
- mydata.people20140325
- mydata.people20140326
- mydata.people20140327
Contoh: dapatkan tabel dalam rentang dua hari hingga "sekarang"
Contoh ini mengasumsikan bahwa tabel berikut ada dalam project bernama
myproject-1234
:- mydata.people20140323
- mydata.people20140324
- mydata.people20140325
#legacySQL SELECT name FROM (TABLE_DATE_RANGE([myproject-1234:mydata.people], DATE_ADD(CURRENT_TIMESTAMP(), -2, 'DAY'), CURRENT_TIMESTAMP())) WHERE age >= 35
Cocok dengan tabel berikut:
- mydata.people20140323
- mydata.people20140324
- mydata.people20140325
TABLE_DATE_RANGE_STRICT(prefix, timestamp1, timestamp2)
-
Fungsi ini setara dengan
TABLE_DATE_RANGE
. Satu-satunya perbedaan adalah jika ada tabel harian yang hilang dalam urutan,TABLE_DATE_RANGE_STRICT
akan gagal dan menampilkan errorNot Found: Table <table_name>
.Contoh: error pada tabel yang hilang
Contoh ini mengasumsikan bahwa tabel berikut ada:
- people20140325
- people20140327
#legacySQL SELECT name FROM (TABLE_DATE_RANGE_STRICT([myproject-1234:mydata.people], TIMESTAMP('2014-03-25'), TIMESTAMP('2014-03-27'))) WHERE age >= 35
Contoh di atas menampilkan error "Not Found" untuk tabel "people20140326".
TABLE_QUERY(dataset, expr)
-
Tabel kueri yang namanya cocok dengan
expr
yang diberikan. Parameterexpr
harus direpresentasikan sebagai string dan harus berisi ekspresi yang akan dinilai. Misalnya,'length(table_id) < 3'
.Contoh: cocokkan tabel yang namanya berisi "oo" dan memiliki panjang lebih dari 4
Contoh ini mengasumsikan bahwa tabel berikut ada:
- mydata.boo
- mydata.fork
- mydata.ooze
- mydata.spoon
#legacySQL SELECT speed FROM (TABLE_QUERY([myproject-1234:mydata], 'table_id CONTAINS "oo" AND length(table_id) >= 4'))
Cocok dengan tabel berikut:
- mydata.ooze
- mydata.spoon
Contoh: cocokkan tabel yang namanya diawali dengan "boo", diikuti oleh 3-5 digit numerik
Contoh ini mengasumsikan bahwa tabel berikut ada dalam project bernama
myproject-1234
:- mydata.book4
- mydata.book418
- mydata.boom12345
- mydata.boom123456789
- mydata.taboo999
#legacySQL SELECT speed FROM TABLE_QUERY([myproject-1234:mydata], 'REGEXP_MATCH(table_id, r"^boo[\d]{3,5}")')
Cocok dengan tabel berikut:
- mydata.book418
- mydata.boom12345
Fungsi URL
Sintaks
Fungsi URL | |
---|---|
HOST() |
Pada URL yang diberikan, fungsi ini menampilkan nama host sebagai string. |
DOMAIN() |
Pada URL yang diberikan, fungsi ini menampilkan domain sebagai string. |
TLD() |
Pada URL yang diberikan, fungsi ini menampilkan domain level teratas plus domain negara apa pun di URL tersebut. |
HOST('url_str')
- Pada URL yang diberikan, fungsi ini menampilkan nama host sebagai string. Contoh: HOST('http://www.google.com:80/index.html') akan menampilkan 'www.google.com'
DOMAIN('url_str')
- Pada URL yang diberikan, fungsi ini menampilkan domain sebagai string. Contoh: DOMAIN('http://www.google.com:80/index.html') akan menampilkan 'google.com'.
TLD('url_str')
- Pada URL yang diberikan, fungsi ini menampilkan domain level teratas plus domain negara apa pun di URL tersebut. Contoh: TLD('http://www.google.com:80/index.html') akan menampilkan '.com'. TLD('http://www.google.co.uk:80/index.html') akan menampilkan '.co.uk'.
Catatan:
- Fungsi ini tidak melakukan pencarian balik DNS, jadi jika Anda memanggil fungsi ini menggunakan alamat IP, fungsi tersebut akan menampilkan segmen alamat IP, bukan segmen nama host.
- Semua fungsi penguraian URL memerlukan karakter huruf kecil. Karakter huruf besar di URL akan menghasilkan hasil NULL atau salah. Pertimbangkan untuk meneruskan input ke fungsi ini melalui LOWER() jika data Anda memiliki penggunaan huruf campuran.
Contoh lanjutan
Mengurai nama domain dari data URL
Kueri ini menggunakan fungsi DOMAIN()
untuk menampilkan domain paling populer yang tercantum sebagai halaman beranda repositori di GitHub. Perhatikan penggunaan HAVING untuk memfilter data menggunakan hasil dari fungsi DOMAIN()
. Fungsi ini berguna untuk menentukan informasi perujuk dari data URL.
Contoh:
#legacySQL SELECT DOMAIN(repository_homepage) AS user_domain, COUNT(*) AS activity_count FROM [bigquery-public-data:samples.github_timeline] GROUP BY user_domain HAVING user_domain IS NOT NULL AND user_domain != '' ORDER BY activity_count DESC LIMIT 5;
Hasil:
+-----------------+----------------+ | user_domain | activity_count | +-----------------+----------------+ | github.com | 281879 | | google.com | 34769 | | khanacademy.org | 17316 | | sourceforge.net | 15103 | | mozilla.org | 14091 | +-----------------+----------------+
Untuk melihat informasi TLD secara khusus, gunakan fungsi TLD()
. Contoh ini menampilkan TLD teratas yang tidak ada dalam daftar contoh umum.
#legacySQL SELECT TLD(repository_homepage) AS user_tld, COUNT(*) AS activity_count FROM [bigquery-public-data:samples.github_timeline] GROUP BY user_tld HAVING /* Only consider TLDs that are NOT NULL */ /* or in our list of common TLDs */ user_tld IS NOT NULL AND NOT user_tld IN ('','.com','.net','.org','.info','.edu') ORDER BY activity_count DESC LIMIT 5;
Hasil:
+----------+----------------+ | user_tld | activity_count | +----------+----------------+ | .de | 22934 | | .io | 17528 | | .me | 13652 | | .fr | 12895 | | .co.uk | 9135 | +----------+----------------+
Fungsi jendela
Fungsi jendela, yang juga dikenal sebagai fungsi analisis, mengaktifkan penghitungan pada subset tertentu, atau "jendela", dari kumpulan hasil. Fungsi jendela mempermudah pembuatan laporan yang menyertakan analisis kompleks seperti rata-rata akhir dan total berjalan.
Setiap fungsi jendela memerlukan klausa OVER
yang menentukan bagian atas dan bawah jendela. Tiga komponen klausa OVER
(partisi, pengurutan, dan pembingkaian) memberikan kontrol tambahan pada jendela. Partisi memungkinkan Anda membagi data input menjadi grup logika yang memiliki karakteristik sama. Dengan pengurutan, Anda dapat mengurutkan hasil dalam partisi. Pembingkaian memungkinkan Anda membuat bingkai jendela geser dalam partisi yang bergerak relatif terhadap baris saat ini. Anda dapat mengonfigurasi ukuran perpindahan bingkai jendela berdasarkan jumlah baris atau rentang nilai, seperti interval waktu.
#legacySQL SELECT <window_function> OVER ( [PARTITION BY <expr>] [ORDER BY <expr> [ASC | DESC]] [<window-frame-clause>] )
PARTITION BY
- Menentukan partisi dasar tempat fungsi ini dioperasikan.
Tentukan satu atau beberapa nama kolom yang dipisahkan koma. Satu partisi akan dibuat untuk setiap kumpulan nilai yang berbeda untuk kolom ini, mirip dengan klausa
GROUP BY
. JikaPARTITION BY
dihilangkan, partisi dasar adalah semua baris dalam input ke fungsi jendela. - Klausa
PARTITION BY
juga memungkinkan fungsi jendela untuk mempartisi data dan memparalelkan eksekusi. Jika Anda ingin menggunakan fungsi jendela denganallowLargeResults
, atau jika Anda ingin menerapkan penggabungan atau agregasi lebih lanjut ke output fungsi jendela, gunakanPARTITION BY
untuk memparalelkan eksekusi.
Klausa JOIN EACH
danGROUP EACH BY
tidak dapat digunakan pada output fungsi jendela. Untuk menghasilkan hasil kueri yang besar saat menggunakan fungsi jendela, Anda harus menggunakanPARTITION BY
.ORDER BY
- Mengurutkan partisi. Jika
ORDER BY
tidak ada, tidak ada jaminan untuk tata urutan default apa pun. Pengurutan terjadi di tingkat partisi, sebelum klausa bingkai jendela diterapkan. Jika menentukan jendelaRANGE
, Anda harus menambahkan klausaORDER BY
. Urutan defaultnya adalahASC
. ORDER BY
bersifat opsional dalam beberapa kasus, tetapi fungsi jendela tertentu, seperti rank() atau dense_rank(), memerlukan klausa tersebut.- Jika Anda menggunakan
ORDER BY
tanpa menentukanROWS
atauRANGE
,ORDER BY
menyiratkan bahwa jendela diperluas dari awal partisi ke baris saat ini. Jika klausaORDER BY
tidak ada, jendela merupakan seluruh partisi. <window-frame-clause>
-
{ROWS | RANGE} {BETWEEN <start> AND <end> | <start> | <end>}
- Subset partisi yang akan digunakan untuk beroperasi. Ukurannya bisa sama dengan partisi atau lebih kecil. Jika Anda menggunakan
ORDER BY
tanpawindow-frame-clause
, bingkai jendela defaultnya adalahRANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
. Jika Anda menghilangkanORDER BY
danwindow-frame-clause
, bingkai jendela default adalah seluruh partisi.ROWS
- Mendefinisikan jendela dalam hal posisi baris, relatif terhadap baris saat ini. Misalnya, untuk menambahkan kolom yang menunjukkan jumlah dari 5 baris nilai gaji sebelumnya, Anda harus menjalankan kueriSUM(salary) OVER (ROWS BETWEEN 5 PRECEDING AND CURRENT ROW)
. Kumpulan baris biasanya mencakup baris saat ini, tetapi hal itu tidak wajib.RANGE
- Mendefinisikan jendela dalam hal rentang nilai di kolom tertentu, relatif terhadap nilai kolom tersebut di baris saat ini. Hanya beroperasi pada angka dan tanggal, dengan nilai tanggal berupa bilangan bulat sederhana (mikrodetik sejak epoch). Baris yang berdekatan dengan nilai yang sama disebut baris peer. Baris peerCURRENT ROW
disertakan dalam bingkai jendela yang menentukanCURRENT ROW
. Misalnya, jika Anda menentukan bagian ujung jendela adalahCURRENT ROW
dan baris berikutnya dalam jendela tersebut memiliki nilai yang sama, nilai tersebut akan disertakan dalam penghitungan fungsi.BETWEEN <start> AND <end>
- Rentang, termasuk baris awal dan akhir. Rentang tidak perlu menyertakan baris saat ini, tetapi<start>
harus mendahului atau sama dengan<end>
.<start>
- Menentukan offset awal untuk jendela ini, relatif terhadap baris saat ini. Opsi berikut didukung: dengan{UNBOUNDED PRECEDING | CURRENT ROW | <expr> PRECEDING | <expr> FOLLOWING}
<expr>
adalah bilangan bulat positif,PRECEDING
menunjukkan nilai rentang atau nomor baris sebelumnya, danFOLLOWING
menunjukkan nilai rentang atau nomor baris berikutnya.UNBOUNDED PRECEDING
berarti baris pertama partisi. Jika bagian awalnya mendahului jendela, bagian tersebut akan ditetapkan ke baris pertama partisi.<end>
- Menentukan offset akhir untuk jendela ini, relatif terhadap baris saat ini. Opsi berikut didukung: dengan{UNBOUNDED FOLLOWING | CURRENT ROW | <expr> PRECEDING | <expr> FOLLOWING}
<expr>
adalah bilangan bulat positif,PRECEDING
menunjukkan nilai rentang atau nomor baris sebelumnya, danFOLLOWING
menunjukkan nilai rentang atau nomor baris berikutnya.UNBOUNDED FOLLOWING
berarti baris terakhir partisi. Jika bagian ujungnya berada di luar bagian akhir jendela, bagian tersebut akan ditetapkan ke baris terakhir partisi.
Tidak seperti fungsi agregasi, yang menciutkan banyak baris input menjadi satu baris output, fungsi jendela menampilkan satu baris output untuk setiap baris input.
Fitur ini mempermudah pembuatan kueri yang menghitung total berjalan dan rata-rata perpindahan. Misalnya, kueri berikut menampilkan total berjalan untuk set data kecil yang terdiri dari lima baris yang ditentukan oleh pernyataan SELECT
:
#legacySQL SELECT name, value, SUM(value) OVER (ORDER BY value) AS RunningTotal FROM (SELECT "a" AS name, 0 AS value), (SELECT "b" AS name, 1 AS value), (SELECT "c" AS name, 2 AS value), (SELECT "d" AS name, 3 AS value), (SELECT "e" AS name, 4 AS value);
Nilai yang ditampilkan:
+------+-------+--------------+ | name | value | RunningTotal | +------+-------+--------------+ | a | 0 | 0 | | b | 1 | 1 | | c | 2 | 3 | | d | 3 | 6 | | e | 4 | 10 | +------+-------+--------------+
Contoh berikut menghitung rata-rata perpindahan nilai dalam baris saat ini dan baris sebelumnya. Bingkai jendela terdiri dari dua baris yang berpindah mengikuti baris saat ini.
#legacySQL SELECT name, value, AVG(value) OVER (ORDER BY value ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS MovingAverage FROM (SELECT "a" AS name, 0 AS value), (SELECT "b" AS name, 1 AS value), (SELECT "c" AS name, 2 AS value), (SELECT "d" AS name, 3 AS value), (SELECT "e" AS name, 4 AS value);
Nilai yang ditampilkan:
+------+-------+---------------+ | name | value | MovingAverage | +------+-------+---------------+ | a | 0 | 0.0 | | b | 1 | 0.5 | | c | 2 | 1.5 | | d | 3 | 2.5 | | e | 4 | 3.5 | +------+-------+---------------+
Sintaks
Fungsi jendela | |
---|---|
AVG() COUNT(*) COUNT([DISTINCT]) MAX() MIN() STDDEV() SUM() |
Operasi yang sama dengan Fungsi agregat yang sesuai, tetapi dihitung melalui jendela yang ditentukan oleh klausa OVER. |
CUME_DIST() |
Menampilkan nilai ganda yang menunjukkan distribusi kumulatif nilai dalam grup nilai ... |
DENSE_RANK() |
Menampilkan peringkat bilangan bulat nilai dalam grup nilai. |
FIRST_VALUE() |
Menampilkan nilai pertama pada kolom yang ditentukan di jendela. |
LAG() |
Memungkinkan Anda membaca data dari baris sebelumnya dalam jendela. |
LAST_VALUE() |
Menampilkan nilai terakhir pada kolom yang ditentukan di jendela. |
LEAD() |
Memungkinkan Anda membaca data dari baris selanjutnya dalam jendela. |
NTH_VALUE() |
Menampilkan nilai <expr> di posisi <n> pada bingkai jendela ...
|
NTILE() |
Membagi jendela ke dalam jumlah bucket yang ditentukan. |
PERCENT_RANK() |
Menampilkan peringkat baris saat ini, relatif terhadap baris lain dalam partisi. |
PERCENTILE_CONT() |
Menampilkan nilai interpolasi yang akan dipetakan ke argumen persentil sehubungan dengan jendela ... |
PERCENTILE_DISC() |
Menampilkan nilai yang paling dekat dengan persentil argumen pada jendela. |
RANK() |
Menampilkan peringkat bilangan bulat nilai dalam grup nilai. |
RATIO_TO_REPORT() |
Menampilkan rasio setiap nilai terhadap jumlah nilai. |
ROW_NUMBER() |
Menampilkan nomor baris saat ini dari hasil kueri pada jendela. |
-
AVG(numeric_expr)
COUNT(*)
COUNT([DISTINCT] field)
MAX(field)
MIN(field)
STDDEV(numeric_expr)
SUM(field)
-
Fungsi jendela ini menjalankan operasi yang sama dengan Fungsi agregat yang sesuai, tetapi dihitung melalui jendela yang ditentukan oleh klausa OVER.
Perbedaan signifikan lainnya adalah bahwa fungsi
COUNT([DISTINCT] field)
memberikan hasil yang tepat saat digunakan sebagai fungsi jendela, dengan perilaku yang mirip dengan fungsi agregatEXACT_COUNT_DISTINCT()
.Dalam contoh kueri, klausa
ORDER BY
menyebabkan jendela dihitung dari awal partisi ke baris saat ini, yang menghasilkan jumlah kumulatif untuk tahun tersebut.#legacySQL SELECT corpus_date, corpus, word_count, SUM(word_count) OVER ( PARTITION BY corpus_date ORDER BY word_count) annual_total FROM [bigquery-public-data:samples.shakespeare] WHERE word='love' ORDER BY corpus_date, word_count
Hasil:
corpus_date corpus word_count annual_total 0 various 37 37 0 sonnets 157 194 1590 2kinghenryvi 18 18 1590 1kinghenryvi 24 42 1590 3kinghenryvi 40 82 CUME_DIST()
-
Menampilkan nilai ganda yang menunjukkan distribusi kumulatif nilai dalam grup nilai, yang dihitung menggunakan formula
<number of rows preceding or tied with the current row> / <total rows>
. Nilai seri akan menampilkan nilai distribusi kumulatif yang sama.Fungsi jendela ini memerlukan
ORDER BY
dalam klausaOVER
.#legacySQL SELECT word, word_count, CUME_DIST() OVER (PARTITION BY corpus ORDER BY word_count DESC) cume_dist, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
Hasil:
word word_count cume_dist handkerchief 29 0,2 satisfaction 5 0,4 displeasure 4 0,8 instruments 4 0,8 circumstance 3 1.0 DENSE_RANK()
-
Menampilkan peringkat bilangan bulat nilai dalam grup nilai. Peringkat tersebut dihitung berdasarkan perbandingan dengan nilai lain dalam grup.
Nilai seri akan ditampilkan sebagai peringkat yang sama. Peringkat nilai berikutnya bertambah 1. Misalnya, jika dua nilai seri untuk peringkat 2, peringkat nilai berikutnya adalah 3. Jika Anda menginginkan perbedaan dalam daftar peringkat, gunakan rank().
Fungsi jendela ini memerlukan
ORDER BY
dalam klausaOVER
. Menampilkan:#legacySQL SELECT word, word_count, DENSE_RANK() OVER (PARTITION BY corpus ORDER BY word_count DESC) dense_rank, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
word word_count dense_rank handkerchief 29 1 satisfaction 5 2 displeasure 4 3 instruments 4 3 circumstance 3 4 FIRST_VALUE(<field_name>)
-
Menampilkan nilai pertama
<field_name>
di jendela. Menampilkan:#legacySQL SELECT word, word_count, FIRST_VALUE(word) OVER (PARTITION BY corpus ORDER BY word_count DESC) fv, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 1
word word_count fv imperfectly 1 imperfectly LAG(<expr>[, <offset>[, <default_value>]])
-
Memungkinkan Anda membaca data dari baris sebelumnya dalam jendela. Secara khusus,
LAG()
menampilkan nilai<expr>
untuk baris yang terletak pada baris<offset>
sebelum baris saat ini. Jika baris tidak ada,<default_value>
akan ditampilkan.#legacySQL SELECT word, word_count, LAG(word, 1) OVER (PARTITION BY corpus ORDER BY word_count DESC) lag, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
Hasil:
word word_count lag handkerchief 29 null satisfaction 5 handkerchief displeasure 4 satisfaction instruments 4 displeasure circumstance 3 instruments LAST_VALUE(<field_name>)
-
Menampilkan nilai terakhir
<field_name>
di jendela.#legacySQL SELECT word, word_count, LAST_VALUE(word) OVER (PARTITION BY corpus ORDER BY word_count DESC) lv, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 1
Menampilkan:
word word_count lv imperfectly 1 imperfectly LEAD(<expr>[, <offset>[, <default_value>]])
-
Memungkinkan Anda membaca data dari baris selanjutnya dalam jendela. Secara khusus,
LEAD()
menampilkan nilai<expr>
untuk baris yang terletak pada baris<offset>
setelah baris saat ini. Jika baris tidak ada,<default_value>
akan ditampilkan. Menampilkan:#legacySQL SELECT word, word_count, LEAD(word, 1) OVER (PARTITION BY corpus ORDER BY word_count DESC) lead, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
word word_count lead handkerchief 29 satisfaction satisfaction 5 displeasure displeasure 4 instruments instruments 4 circumstance circumstance 3 null NTH_VALUE(<expr>, <n>)
-
Menampilkan nilai
<expr>
di posisi<n>
pada bingkai jendela, dengan<n>
sebagai indeks berbasis satu. NTILE(<num_buckets>)
-
Membagi urutan baris menjadi
<num_buckets>
bucket dan menetapkan nomor bucket yang sesuai, sebagai bilangan bulat, untuk setiap baris. Fungsintile()
menetapkan nomor bucket secukupnya dan menampilkan nilai dari 1 hingga<num_buckets>
untuk setiap baris. Menampilkan:#legacySQL SELECT word, word_count, NTILE(2) OVER (PARTITION BY corpus ORDER BY word_count DESC) ntile, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
word word_count ntile handkerchief 29 1 satisfaction 5 1 displeasure 4 1 instruments 4 2 circumstance 3 2 PERCENT_RANK()
-
Menampilkan peringkat baris saat ini, relatif terhadap baris lain dalam partisi. Nilai yang ditampilkan berkisar antara 0 dan 1, secara inklusif. Nilai pertama yang ditampilkan adalah 0,0.
Fungsi jendela ini memerlukan
ORDER BY
dalam klausaOVER
. Menampilkan:#legacySQL SELECT word, word_count, PERCENT_RANK() OVER (PARTITION BY corpus ORDER BY word_count DESC) p_rank, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
word word_count p_rank handkerchief 29 0.0 satisfaction 5 0,25 displeasure 4 0,5 instruments 4 0,5 circumstance 3 1.0 PERCENTILE_CONT(<percentile>)
-
Menampilkan nilai interpolasi yang akan dipetakan ke argumen persentil sehubungan dengan jendela, setelah mengurutkannya per klausa
ORDER BY
.<percentile>
harus antara 0 dan 1.Fungsi jendela ini memerlukan
ORDER BY
dalam klausaOVER
. Menampilkan:#legacySQL SELECT word, word_count, PERCENTILE_CONT(0.5) OVER (PARTITION BY corpus ORDER BY word_count DESC) p_cont, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
word word_count p_cont handkerchief 29 4 satisfaction 5 4 displeasure 4 4 instruments 4 4 circumstance 3 4 PERCENTILE_DISC(<percentile>)
-
Menampilkan nilai yang paling dekat dengan persentil argumen pada jendela.
<percentile>
harus antara 0 dan 1.Fungsi jendela ini memerlukan
ORDER BY
dalam klausaOVER
. Menampilkan:#legacySQL SELECT word, word_count, PERCENTILE_DISC(0.5) OVER (PARTITION BY corpus ORDER BY word_count DESC) p_disc, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
word word_count p_disc handkerchief 29 4 satisfaction 5 4 displeasure 4 4 instruments 4 4 circumstance 3 4 RANK()
-
Menampilkan peringkat bilangan bulat nilai dalam grup nilai. Peringkat tersebut dihitung berdasarkan perbandingan dengan nilai lain dalam grup.
Nilai seri akan ditampilkan sebagai peringkat yang sama. Peringkat nilai berikutnya bertambah sesuai dengan berapa banyak nilai seri yang terjadi sebelumnya. Misalnya, jika dua nilai seri untuk peringkat 2, peringkat nilai berikutnya adalah 4, bukan 3. Jika Anda tidak menginginkan kekosongan dalam daftar peringkat, gunakan dense_rank().
Fungsi jendela ini memerlukan
ORDER BY
dalam klausaOVER
. Menampilkan:#legacySQL SELECT word, word_count, RANK() OVER (PARTITION BY corpus ORDER BY word_count DESC) rank, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
word word_count rank handkerchief 29 1 satisfaction 5 2 displeasure 4 3 instruments 4 3 circumstance 3 5 RATIO_TO_REPORT(<column>)
-
Menampilkan rasio setiap nilai terhadap jumlah nilai, sebagai ganda antara 0 dan 1.
Menampilkan:#legacySQL SELECT word, word_count, RATIO_TO_REPORT(word_count) OVER (PARTITION BY corpus ORDER BY word_count DESC) r_to_r, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
word word_count r_to_r handkerchief 29 0.6444444444444445 satisfaction 5 0.1111111111111111 displeasure 4 0.08888888888888889 instruments 4 0.08888888888888889 circumstance 3 0.06666666666666667 ROW_NUMBER()
-
Menampilkan nomor baris saat ini dari hasil kueri pada jendela, dimulai dengan 1.
Menampilkan:#legacySQL SELECT word, word_count, ROW_NUMBER() OVER (PARTITION BY corpus ORDER BY word_count DESC) row_num, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
word word_count row_num handkerchief 29 1 satisfaction 5 2 displeasure 4 3 instruments 4 4 circumstance 3 5
Fungsi lainnya
Sintaks
Fungsi lainnya | |
---|---|
CASE WHEN ... THEN |
Gunakan CASE untuk memilih di antara dua atau beberapa ekspresi alternatif dalam kueri Anda. |
CURRENT_USER() |
Menampilkan alamat email pengguna yang menjalankan kueri. |
EVERY() |
Menampilkan true jika argumen benar untuk semua inputnya. |
FROM_BASE64() |
Mengonversi string input berenkode base-64 ke format BYTES. |
HASH() |
Menghitung dan menampilkan nilai hash yang ditandatangani 64-bit ... |
FARM_FINGERPRINT() |
Menghitung dan menampilkan nilai sidik jari 64-bit yang ditandatangani ... |
IF() |
Jika argumen pertama benar, argumen kedua akan ditampilkan. Jika tidak, argumen ketiga akan ditampilkan. |
POSITION() |
Menampilkan posisi argumen berbasis satu dan berurutan. |
SHA1() |
Menampilkan hash SHA1, dalam format BYTES. |
SOME() |
Menampilkan true jika argumen benar untuk setidaknya salah satu inputnya. |
TO_BASE64() |
Mengonversi argumen BYTES kei string berenkode base-64. |
CASE WHEN when_expr1 THEN then_expr1
WHEN when_expr2 THEN then_expr2 ...
ELSE else_expr END- Gunakan CASE untuk memilih di antara dua atau beberapa ekspresi alternatif dalam kueri Anda. Ekspresi WHEN harus berupa boolean, dan semua ekspresi dalam klausa THEN dan klausa ELSE harus berupa jenis yang kompatibel.
CURRENT_USER()
- Menampilkan alamat email pengguna yang menjalankan kueri.
EVERY(<condition>)
- Menampilkan
true
jikacondition
benar untuk semua inputnya. Saat digunakan dengan klausaOMIT IF
, fungsi ini berguna untuk kueri yang melibatkan kolom berulang. FROM_BASE64(<str>)
- Mengonversi
str
string input berenkode base-64 ke format BYTES. Untuk mengonversi BYTES ke string berenkode base-64, gunakan TO_BASE64(). HASH(expr)
- Menghitung dan menampilkan nilai hash 64-bit yang ditandatangani untuk byte
expr
seperti yang ditentukan oleh library CityHash (versi 1.0.3). Semua ekspresi string atau bilangan bulat didukung dan fungsi ini mengikutiIGNORE CASE
untuk string, yang menampilkan nilai invarian untuk huruf besar/kecil. FARM_FINGERPRINT(expr)
- Menghitung dan menampilkan nilai sidik jari yang ditandatangani 64-bit dari input
STRING
atauBYTES
menggunakan fungsiFingerprint64
dari library FarmHash open source. Output fungsi ini untuk input tertentu tidak akan pernah berubah dan cocok dengan output fungsiFARM_FINGERPRINT
saat menggunakan GoogleSQL. MengikutiIGNORE CASE
untuk string, yang menampilkan nilai invarian untuk huruf besar/kecil. IF(condition, true_return, false_return)
- Menampilkan
true_return
ataufalse_return
, tergantung pada apakahcondition
benar atau salah. Nilai yang ditampilkan dapat berupa literal atau nilai yang berasal dari kolom, tetapi harus berupa jenis data yang sama. Nilai yang berasal dari kolom tidak perlu disertakan dalam klausaSELECT
. POSITION(field)
- Menampilkan posisi kolom berbasis satu dan berurutan dalam kumpulan kolom berulang.
SHA1(<str>)
- Menampilkan hash SHA1, dalam format BYTES, dari string input
str
. Anda dapat mengonversi hasilnya ke base-64 menggunakan TO_BASE64(). Contoh:#legacySQL SELECT TO_BASE64(SHA1(corpus)) FROM [bigquery-public-data:samples.shakespeare] LIMIT 100;
SOME(<condition>)
- Menampilkan
true
jikacondition
bernilai benar untuk setidaknya salah satu inputnya. Saat digunakan dengan klausaOMIT IF
, fungsi ini berguna untuk kueri yang melibatkan kolom berulang. TO_BASE64(<bin_data>)
- Mengonversi input BYTES
bin_data
ke string berenkode base-64. Contoh: Untuk mengonversi string berenkode base64 ke BYTES, gunakan FROM_BASE64().#legacySQL SELECT TO_BASE64(SHA1(title)) FROM [bigquery-public-data:samples.wikipedia] LIMIT 100;
Contoh lanjutan
-
Mengelompokkan hasil ke dalam kategori menggunakan kondisional
Kueri berikut menggunakan blok
CASE/WHEN
untuk mengelompokkan hasil ke dalam kategori "region" berdasarkan daftar status. Jika status tidak muncul sebagai opsi di salah satu pernyataanWHEN
, nilai status akan ditetapkan secara default ke "None".Contoh:
#legacySQL SELECT CASE WHEN state IN ('WA', 'OR', 'CA', 'AK', 'HI', 'ID', 'MT', 'WY', 'NV', 'UT', 'CO', 'AZ', 'NM') THEN 'West' WHEN state IN ('OK', 'TX', 'AR', 'LA', 'TN', 'MS', 'AL', 'KY', 'GA', 'FL', 'SC', 'NC', 'VA', 'WV', 'MD', 'DC', 'DE') THEN 'South' WHEN state IN ('ND', 'SD', 'NE', 'KS', 'MN', 'IA', 'MO', 'WI', 'IL', 'IN', 'MI', 'OH') THEN 'Midwest' WHEN state IN ('NY', 'PA', 'NJ', 'CT', 'RI', 'MA', 'VT', 'NH', 'ME') THEN 'Northeast' ELSE 'None' END as region, average_mother_age, average_father_age, state, year FROM (SELECT year, state, SUM(mother_age)/COUNT(mother_age) as average_mother_age, SUM(father_age)/COUNT(father_age) as average_father_age FROM [bigquery-public-data:samples.natality] WHERE father_age < 99 GROUP BY year, state) ORDER BY year LIMIT 5;
Hasil:
+--------+--------------------+--------------------+-------+------+ | region | average_mother_age | average_father_age | state | year | +--------+--------------------+--------------------+-------+------+ | South | 24.342600163532296 | 27.683769419460344 | AR | 1969 | | West | 25.185041908446163 | 28.268214055448098 | AK | 1969 | | West | 24.780776677578217 | 27.831181063905248 | CA | 1969 | | West | 25.005834769924412 | 27.942978384829598 | AZ | 1969 | | South | 24.541730952905738 | 27.686430093306885 | AL | 1969 | +--------+--------------------+--------------------+-------+------+
-
Menyimulasikan Tabel Pivot
Gunakan pernyataan kondisional untuk menyusun hasil kueri subpilihan ke dalam baris dan kolom. Dalam contoh di bawah ini, hasil penelusuran untuk sebagian besar artikel Wikipedia yang direvisi yang dimulai dengan nilai 'Google' akan disusun ke dalam kolom yang menampilkan jumlah revisi jika memenuhi berbagai kriteria.
Contoh:
#legacySQL SELECT page_title, /* Populate these columns as True or False, */ /* depending on the condition */ IF (page_title CONTAINS 'search', INTEGER(total), 0) AS search, IF (page_title CONTAINS 'Earth' OR page_title CONTAINS 'Maps', INTEGER(total), 0) AS geo, FROM /* Subselect to return top revised Wikipedia articles */ /* containing 'Google', followed by additional text. */ (SELECT TOP (title, 5) as page_title, COUNT (*) as total FROM [bigquery-public-data:samples.wikipedia] WHERE REGEXP_MATCH (title, r'^Google.+') AND wp_namespace = 0 );
Hasil:
+---------------+--------+------+ | page_title | search | geo | +---------------+--------+------+ | Google search | 4261 | 0 | | Google Earth | 0 | 3874 | | Google Chrome | 0 | 0 | | Google Maps | 0 | 2617 | | Google bomb | 0 | 0 | +---------------+--------+------+
-
Menggunakan HASH untuk memilih sampel acak dari data Anda
Beberapa kueri dapat memberikan hasil yang berguna menggunakan subsampling acak dari kumpulan hasil. Untuk mengambil sampel nilai secara acak, gunakan fungsi
HASH
untuk menampilkan hasil di mana modulus "n" dari hash tersebut sama dengan nol.Misalnya, kueri berikut akan menemukan
HASH()
dari nilai "title", lalu memeriksa apakah nilai modulus "2" adalah nol. Ini akan mengakibatkan sekitar 50% nilai diberi label sebagai "sampled". Untuk mengambil sampel nilai yang lebih sedikit, naikkan nilai operasi modulus dari "2" ke nilai yang lebih besar. Kueri menggunakan fungsiABS
yang dikombinasikan denganHASH
, karenaHASH
dapat menampilkan nilai negatif, dan operator modulus pada nilai negatif menghasilkan nilai negatif.Contoh:
#legacySQL SELECT title, HASH(title) AS hash_value, IF(ABS(HASH(title)) % 2 == 1, 'True', 'False') AS included_in_sample FROM [bigquery-public-data:samples.wikipedia] WHERE wp_namespace = 0 LIMIT 5;