PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana Width_Bucket() Bekerja di PostgreSQL

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Webinar :Fitur Baru di PostgreSQL 11 [Tindak lanjut]

  2. PostgreSQL tidak menggunakan indeks parsial

  3. Menggunakan waktu saat ini di UTC sebagai nilai default di PostgreSQL

  4. Bagikan koneksi ke postgres db di seluruh proses dengan Python

  5. PostgreSql 'PDOException' dengan pesan 'tidak dapat menemukan driver'