Di PostgreSQL, width_bucket()
adalah fungsi matematika yang memberikan nilai ke keranjang (segmen individual) dalam histogram equiwidth.
Jenis yang dikembalikan adalah int .
Sintaks
Fungsi ini dapat digunakan dengan salah satu dari tiga sintaks berikut:
width_bucket(operand dp, b1 dp, b2 dp, count int)
width_bucket(operand numeric, b1 numeric, b2 numeric, count int)
width_bucket(operand anyelement, thresholds anyarray)
Dua yang pertama pada dasarnya sama, kecuali bahwa mereka menggunakan tipe data yang berbeda (presisi ganda vs numerik).
Ketiga sintaks ini dijelaskan di bawah ini.
width_bucket(operand dp, b1 dp, b2 dp, count int)
- Mengembalikan nomor bucket yang akan ditetapkan operan dalam histogram yang memiliki jumlah bucket dengan lebar yang sama yang mencakup rentang b1 hingga b2; mengembalikan 0 atau count+1 untuk input di luar rentang.
width_bucket(operand numeric, b1 numeric, b2 numeric, count int)
- Mengembalikan nomor bucket yang akan ditetapkan operan dalam histogram yang memiliki jumlah bucket dengan lebar yang sama yang mencakup rentang b1 hingga b2; mengembalikan 0 atau count+1 untuk input di luar rentang.
width_bucket(operand anyelement, thresholds anyarray)
- Mengembalikan nomor bucket ke operan yang akan ditetapkan dengan array yang mencantumkan batas bawah bucket; mengembalikan 0 untuk input yang kurang dari batas bawah pertama; array ambang batas harus diurutkan, yang terkecil terlebih dahulu, atau hasil yang tidak diharapkan akan diperoleh.
Contoh – Sintaks Pertama/Kedua
Seperti disebutkan, dua sintaks pertama pada dasarnya sama, kecuali bahwa mereka menguraikan tipe data yang berbeda (presisi ganda vs numerik).
Berikut adalah contoh untuk mendemonstrasikan cara kerja dua sintaks pertama.
SELECT
width_bucket(3, 1, 12, 3),
width_bucket(5, 1, 12, 3),
width_bucket(9, 1, 12, 3);
Hasil:
width_bucket | width_bucket | width_bucket --------------+--------------+-------------- 1 | 2 | 3
Berikut penjelasannya. Mari kita periksa setiap argumen, mulai dari yang terakhir dan bekerja mundur ke yang pertama.
- Argumen keempat :Saya menentukan tiga ember. Saya melakukan ini dengan menggunakan 3 sebagai argumen keempat.
- Argumen kedua dan ketiga :Saya menetapkan bahwa rentangnya adalah antara 1 dan 12. Dalam hal ini, argumen kedua saya adalah 1 dan argumen ketiga adalah 12.
- Argumen pertama :Nilai ini dibandingkan dengan argumen kedua dan ketiga, untuk mengetahui mana dari tiga ember yang harus ditetapkan. Dalam contoh saya, saya memanggil
width_bucket()
tiga kali untuk menggambarkan konsep yang lebih baik. Saya melakukan ini agar saya dapat memberikan tiga nilai berbeda sebagai argumen pertama, yang masing-masing ditetapkan ke keranjang yang berbeda.
Tabel berikut memberikan cara lain untuk memvisualisasikan ini:
Nilai | Ember |
---|---|
1, 2, 3, 4 | Ember 1 |
5, 6, 7, 8 | Ember 2 |
9, 10, 11, 12 | Ember 3 |
Jadi kita dapat melihat bahwa ember pertama menerima nilai antara 1 dan 4, ember kedua antara 5 dan 8, dan ember ketiga untuk nilai antara 9 dan 12.
Jika saya mengubahnya sehingga ada empat ember, kode saya mungkin terlihat seperti ini:
SELECT
width_bucket(3, 1, 12, 4),
width_bucket(5, 1, 12, 4),
width_bucket(9, 1, 12, 4);
Dan tabelnya akan terlihat seperti ini:
Nilai | Ember |
---|---|
1, 2, 3 | Ember 1 |
4, 5, 6 | Ember 2 |
7, 8, 9 | Ember 3 |
10, 11, 12 | Ember 4 |
Di Luar Jangkauan
Jika input berada di luar rentang bucket, Anda akan mendapatkan 0 atau hitung +1, bergantung pada apakah input di bawah rentang atau di atasnya.
Contoh:
SELECT
width_bucket(-3, 1, 12, 3),
width_bucket(20, 1, 12, 3);
Hasil:
width_bucket | width_bucket --------------+-------------- 0 | 4
Contoh – Sintaks Ketiga
Untuk mendemonstrasikan sintaks ketiga, mari kita ambil contoh pertama di atas, dan modifikasi untuk menggunakan sintaks ketiga:
SELECT
width_bucket(3, array[1, 4, 8]),
width_bucket(5, array[1, 4, 8]),
width_bucket(9, array[1, 4, 8]);
Hasil:
width_bucket | width_bucket | width_bucket --------------+--------------+-------------- 1 | 2 | 3
Di sini saya membuat 3 ember dan menetapkan nilai eksplisit untuk masing-masing ember. Dalam hal ini, semuanya adalah bucket dengan lebar yang sama, tetapi itu bukan persyaratan.
Manfaat utama dari sintaks ketiga adalah memungkinkan Anda membuat ember dengan lebar yang tidak sama.
Sebagai contoh, saya dapat mengubah contoh sebelumnya menjadi ini:
SELECT
width_bucket(3, array[1, 3, 12]),
width_bucket(5, array[1, 3, 12]),
width_bucket(9, array[1, 3, 12]);
Hasil:
width_bucket | width_bucket | width_bucket --------------+--------------+-------------- 2 | 2 | 2
Melakukan hal ini akan mengubah ember yang ditetapkan untuk setiap nomor. Sekarang, semua angka itu termasuk dalam ember kedua.
Sintaks ketiga dapat berguna untuk berbagai kasus penggunaan. Misalnya, Anda mungkin memiliki rentang kelompok usia yang tidak merata.
SELECT
width_bucket(15, array[10, 18, 30, 50, 65]) AS "Age Group (15)",
width_bucket(45, array[10, 18, 30, 50, 65]) AS "Age Group (45)",
width_bucket(50, array[10, 18, 30, 50, 65]) AS "Age Group (50)";
Hasil:
Age Group (15) | Age Group (45) | Age Group (50) ----------------+----------------+---------------- 1 | 3 | 4
Di Luar Jangkauan
Fungsi mengembalikan 0 jika input kurang dari batas bawah pertama.
Contoh:
SELECT width_bucket(8, array[10, 40, 30]);
Hasil:
0
Width_Bucket() vs CASE
Contoh pada halaman ini juga dapat dilakukan dengan menggunakan CASE
penyataan. Perbedaannya adalah width_bucket()
melakukannya dengan cara yang lebih ringkas.
Inilah cara kita dapat menulis ulang contoh sebelumnya menggunakan CASE
pernyataan.
SELECT
CASE
WHEN 8 BETWEEN 0 AND 9 THEN 0
WHEN 8 BETWEEN 10 AND 39 THEN 1
WHEN 8 BETWEEN 40 AND 49 THEN 2
ELSE 3
END;
Hasil:
0
Ingatlah bahwa masukan dalam semua contoh ini biasanya berupa variabel atau nama kolom, bukan konstanta.