Fungsi tabel

Fungsi tabel, yang juga disebut fungsi yang bernilai tabel (TVF), merupakan fungsi yang ditentukan pengguna dan menampilkan tabel. Anda bisa menggunakan fungsi tabel di mana pun Anda bisa menggunakan tabel. Fungsi tabel berperilaku mirip dengan tampilan, tetapi fungsi tabel dapat mengambil parameter.

Membuat fungsi tabel

Untuk membuat fungsi tabel, gunakan pernyataan CREATE TABLE FUNCTION. Fungsi tabel berisi kueri yang menghasilkan tabel. Fungsi ini menampilkan hasil kueri. Fungsi tabel berikut mengambil parameter INT64 dan menggunakan nilai ini di dalam klausa WHERE dalam kueri melalui set data publik yang disebut bigquery-public-data.usa_names.usa_1910_current .

CREATE OR REPLACE TABLE FUNCTION mydataset.names_by_year(y INT64)
AS (
  SELECT year, name, SUM(number) AS total
  FROM `bigquery-public-data.usa_names.usa_1910_current`
  WHERE year = y
  GROUP BY year, name
);

Untuk memfilter dengan cara lain, Anda dapat meneruskan beberapa parameter ke fungsi tabel. Fungsi tabel berikut memfilter data menurut tahun dan awalan nama:

CREATE OR REPLACE TABLE FUNCTION mydataset.names_by_year_and_prefix(
  y INT64, z STRING)
AS (
  SELECT year, name, SUM(number) AS total
  FROM `bigquery-public-data.usa_names.usa_1910_current`
  WHERE
    year = y
    AND STARTS_WITH(name, z)
  GROUP BY year, name
);

Parameter tabel

Anda dapat menetapkan parameter TVF menjadi tabel. Setelah nama parameter tabel, Anda harus menentukan skema tabel yang diperlukan secara eksplisit, dengan cara yang sama seperti Anda menentukan kolom struct. Argumen tabel yang Anda teruskan ke TVF dapat berisi kolom tambahan selain yang ditentukan dalam skema parameter, dan kolom dapat muncul dalam urutan apa pun.

Fungsi tabel berikut menampilkan tabel yang berisi total penjualan untuk item_name dari tabel orders:

CREATE TABLE FUNCTION mydataset.compute_sales (
  orders TABLE<sales INT64, item STRING>, item_name STRING)
AS (
  SELECT SUM(sales) AS total_sales, item
  FROM orders
  WHERE item = item_name
  GROUP BY item
);

Nama parameter

Jika parameter fungsi tabel cocok dengan nama kolom tabel, parameter tersebut dapat membuat referensi yang ambigu. Dalam hal ini, BigQuery akan menafsirkan nama tersebut sebagai referensi ke kolom tabel, bukan parameter. Praktik yang direkomendasikan adalah menggunakan nama parameter yang berbeda dengan nama kolom tabel yang direferensikan.

Menggunakan fungsi tabel

Anda dapat memanggil fungsi tabel dalam konteks apa pun jika tabel tersebut valid. Contoh berikut memanggil fungsi mydataset.names_by_year dalam klausa FROM pernyataan SELECT:

SELECT * FROM mydataset.names_by_year(1950)
  ORDER BY total DESC
  LIMIT 5

Hasilnya akan terlihat seperti berikut:

+------+--------+-------+
| year |  name  | total |
+------+--------+-------+
| 1950 | James  | 86447 |
| 1950 | Robert | 83717 |
| 1950 | Linda  | 80498 |
| 1950 | John   | 79561 |
| 1950 | Mary   | 65546 |
+------+--------+-------+

Anda dapat menggabungkan output dari fungsi tabel dengan tabel lain:

SELECT *
  FROM `bigquery-public-data.samples.shakespeare` AS s
  JOIN mydataset.names_by_year(1950) AS n
  ON n.name = s.word

Anda juga dapat menggunakan fungsi tabel di subkueri:

SELECT ARRAY(
  SELECT name FROM mydataset.names_by_year(1950)
  ORDER BY total DESC
  LIMIT 5)

Saat memanggil fungsi tabel yang memiliki parameter tabel, Anda harus menggunakan kata kunci TABLE sebelum nama argumen tabel. Argumen tabel dapat memiliki kolom yang tidak tercantum dalam skema parameter tabel:

CREATE TABLE FUNCTION mydataset.compute_sales (
  orders TABLE<sales INT64, item STRING>, item_name STRING)
AS (
  SELECT SUM(sales) AS total_sales, item
  FROM orders
  WHERE item = item_name
  GROUP BY item
);

WITH my_orders AS (
    SELECT 1 AS sales, "apple" AS item, 0.99 AS price
    UNION ALL
    SELECT 2, "banana", 0.49
    UNION ALL
    SELECT 5, "apple", 0.99)
SELECT *
FROM mydataset.compute_sales(TABLE my_orders, "apple");

/*-------------+-------+
 | total_sales | item  |
 +-------------+-------+
 | 6           | apple |
 +-------------+-------*/

Mencantumkan fungsi tabel

Fungsi tabel adalah jenis rutinitas. Untuk mencantumkan semua rutinitas dalam set data, lihat Mencantumkan rutinitas.

Menghapus fungsi tabel

Untuk menghapus fungsi tabel, gunakan pernyataan DROP TABLE FUNCTION:

DROP TABLE FUNCTION mydataset.names_by_year

Memberi otorisasi kepada rutinitas

Anda dapat mengizinkan fungsi tabel sebagai rutinitas. Rutinitas yang diotorisasi memungkinkan Anda membagikan hasil kueri kepada pengguna atau grup tertentu tanpa memberi mereka akses ke tabel dasar yang membuat hasil tersebut. Misalnya, rutinitas yang diizinkan dapat menghitung agregasi atas data atau mencari nilai tabel dan menggunakan nilai tersebut dalam komputasi. Untuk mengetahui informasi selengkapnya, lihat Rutinitas yang diotorisasi.

Batasan

  • Isi kueri harus berupa pernyataan SELECT dan tidak dapat mengubah apa pun. Misalnya, pernyataan bahasa definisi data (DDL) dan bahasa manipulasi data (DML) tidak diizinkan dalam fungsi tabel. Jika Anda memerlukan efek samping, sebaiknya tulis prosedur.

  • Fungsi tabel harus disimpan di lokasi yang sama dengan tabel yang dirujuknya.

Kuota

Untuk mengetahui informasi selengkapnya tentang kuota dan batas fungsi tabel, lihat Kuota dan batas.