Topik ini mencantumkan fungsi-fungsi yang didukung oleh Pembaruan Bertahap Dynamic Table, termasuk daftar dukungan fungsi serta deskripsi dan contoh penggunaan untuk fungsi seperti hg_id_encoding dan min_by/max_by.
Daftar dukungan fungsi
Pembaruan Bertahap Dynamic Table mendukung fungsi agregat dasar, seperti COUNT, SUM, MIN/MAX, dan COUNT DISTINCT. Tabel berikut mencantumkan dukungan untuk fungsi yang lebih kompleks.
|
Function name |
Description |
Dynamic Table example |
Supported versions |
|
Memetakan bidang UID bertipe text ke tipe int atau bigint. Setiap kali fungsi ini dipanggil, data secara otomatis ditulis dan diperbarui di tabel pemetaan pengguna. Fungsi ini sering digunakan untuk menghitung unique visitors (UVs) dalam epoch yang panjang. Dalam skenario tersebut, UID pengguna merupakan bidang teks yang dipetakan ke tipe int guna memfasilitasi perhitungan RoaringBitmap. |
Untuk informasi selengkapnya, lihat Menghitung UV dalam periode sembarang panjang menggunakan Dynamic Table Hologres. |
|
|
|
Fungsi min_by dan max_by menemukan nilai maksimum atau minimum pada kolom expr2 dan mengembalikan nilai yang sesuai dari kolom expr1.
|
Untuk informasi selengkapnya, lihat Contoh Dynamic Table. |
|
|
|
RB_BUILD_AGG |
Deskripsi: Parameter kolom mendukung tipe int32 dan int64. Untuk informasi selengkapnya, lihat Fungsi RoaringBitmap. |
Lihat Solusi Perhitungan UV Periode Panjang Sembarang dengan Dynamic Table Hologres. |
|
|
string_agg |
Deskripsi:
|
|
|
|
array_agg |
Deskripsi:
|
|
|
|
any_value |
Dalam kueri agregat yang mencakup klausa group by, fungsi ini secara acak memilih dan mengembalikan nilai dari suatu baris dalam setiap kelompok agregasi. Hasilnya bersifat non-deterministik. |
|
|
hg_id_encoding_int32 / hg_id_encoding_int64
Hologres V4.1 dan versi setelahnya mendukung fungsi hg_id_encoding_int32 dan hg_id_encoding_int64. Fungsi-fungsi ini memetakan bidang UID bertipe text ke tipe int32 atau int64 dan secara otomatis menulis data ke tabel user_mapping. Anda dapat menggabungkan fungsi-fungsi ini dengan Pembaruan Bertahap Dynamic Table dan RoaringBitmap untuk menghitung UV dalam epoch yang panjang. Untuk informasi selengkapnya, lihat praktik terbaik untuk analisis perilaku pengguna.
Sintaksis
hg_id_encoding_int4(<user_id>, '<mapping_tablename>')
hg_id_encoding_int8(<user_id>, '<mapping_tablename>')
Parameter:
-
Parameter pertama: Kolom UID bertipe text.
-
Parameter kedua: Nama tabel user_mapping. Anda harus membuat tabel pemetaan pengguna terlebih dahulu untuk memetakan UID bertipe text ke tipe int.
Batasan
-
Tabel user_mapping harus memiliki primary key dan hanya satu bidang Serial selain primary key. Saat ini, hanya primary key satu kolom bertipe text yang didukung.
-
Parameter pertama hanya mendukung bidang UID bertipe text dan tidak mendukung nilai NULL. Jika tidak, akan terjadi error saat fungsi dieksekusi.
-
Saat fungsi dipanggil, data pemetaan secara otomatis ditulis ke tabel user_mapping. Jika UID sudah ada, entri tersebut akan diabaikan dan hanya data baru yang ditambahkan.
-
Hanya didukung di Hologres V4.1 dan versi setelahnya.
Contoh
CREATE TABLE base_table(user_id text);
INSERT INTO base_table VALUES('a');
-- Buat tabel user_mapping.
CREATE TABLE uid_mapping(user_id text PRIMARY KEY, id serial);
-- Petakan UID dari tabel dasar menggunakan hg_id_encoding_int4 dan tulis secara otomatis ke tabel pemetaan.
SELECT user_id, hg_id_encoding_int4(user_id, 'uid_mapping') AS res FROM base_table;
-- Kueri tabel pemetaan.
-- user_id | id
-- --------+----
-- a | 1
min_by / max_by
Fungsi min_by dan max_by menemukan nilai minimum atau maksimum pada kolom expr2 dan mengembalikan nilai yang sesuai dari kolom expr1.
min_by(expr1, expr2)
max_by(expr1, expr2)
Parameter: expr2 adalah kolom yang digunakan untuk perbandingan, sedangkan expr1 adalah kolom terkait yang nilainya dikembalikan. Nilai kembalian: Nilai expr1 dari baris yang memiliki nilai minimum atau maksimum pada expr2. Batasan: Hanya didukung di Hologres V4.0 dan versi setelahnya.
Contoh Dynamic Table
DROP TABLE IF EXISTS detail;
CREATE TABLE detail (
userid text,
event_id text,
create_time timestamptz
);
INSERT INTO detail(userid, event_id, create_time) VALUES
('user_1', 'e1', '2024-12-20 10:00:00+08'),
('user_1', 'e2', '2024-12-20 11:30:00+08'),
('user_1', 'e3', '2024-12-21 09:15:00+08'),
('user_2', 'e4', '2024-12-20 08:05:00+08'),
('user_2', 'e5', '2024-12-22 14:20:00+08'),
('user_3', 'e6', '2024-12-21 16:45:00+08');
DROP TABLE IF EXISTS detail_user_first_last_event;
CREATE DYNAMIC TABLE detail_user_first_last_event
WITH (
auto_refresh_mode = 'incremental',
computing_resource = 'local',
freshness = '3 minutes'
)
AS
SELECT
userid,
min_by(event_id, create_time) AS first_event_id,
max_by(event_id, create_time) AS last_event_id,
date_trunc('day', max(create_time))::date AS dt
FROM detail
GROUP BY userid;