PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cách Width_Bucket () hoạt động trong PostgreSQL

Trong PostgreSQL, width_bucket() là một hàm toán học chỉ định các giá trị cho các nhóm (các phân đoạn riêng lẻ) trong một biểu đồ độ rộng tương đương.

Loại trả về là int .

Cú pháp

Hàm có thể được sử dụng với bất kỳ cú pháp nào trong ba cú pháp sau:

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)

Hai thứ đầu tiên về cơ bản giống nhau, ngoại trừ việc chúng sử dụng các kiểu dữ liệu khác nhau (độ chính xác kép so với số).

Ba cú pháp này được giải thích bên dưới.

width_bucket(operand dp, b1 dp, b2 dp, count int)
Trả về số nhóm mà toán hạng sẽ được chỉ định trong biểu đồ có đếm các nhóm có chiều rộng bằng nhau kéo dài phạm vi từ b1 đến b2; trả về 0 hoặc đếm + 1 cho một đầu vào bên ngoài phạm vi.
width_bucket(operand numeric, b1 numeric, b2 numeric, count int)
Trả về số nhóm mà toán hạng sẽ được chỉ định trong biểu đồ có đếm các nhóm có chiều rộng bằng nhau kéo dài phạm vi từ b1 đến b2; trả về 0 hoặc đếm + 1 cho một đầu vào bên ngoài phạm vi.
width_bucket(operand anyelement, thresholds anyarray)
Trả về số nhóm mà toán hạng sẽ được gán cho một mảng liệt kê các giới hạn dưới của các nhóm; trả về 0 cho đầu vào nhỏ hơn giới hạn dưới đầu tiên; mảng ngưỡng phải được sắp xếp, thu được kết quả đầu tiên nhỏ nhất hoặc không mong muốn.

Ví dụ - Cú pháp thứ nhất / thứ hai

Như đã đề cập, hai cú pháp đầu tiên về cơ bản giống nhau, ngoại trừ việc chúng phác thảo các kiểu dữ liệu khác nhau (độ chính xác kép so với số).

Dưới đây là một ví dụ để chứng minh cách hoạt động của hai cú pháp đầu tiên.

SELECT 
  width_bucket(3, 1, 12, 3),
  width_bucket(5, 1, 12, 3),
  width_bucket(9, 1, 12, 3);

Kết quả:

 width_bucket | width_bucket | width_bucket
--------------+--------------+--------------
            1 |            2 |            3

Đây là lời giải thích. Hãy kiểm tra từng đối số, bắt đầu từ đối số cuối cùng và làm ngược lại đối số đầu tiên.

  • Đối số thứ tư :Tôi chỉ định ba nhóm. Tôi làm điều này bằng cách sử dụng 3 làm đối số thứ tư.
  • Đối số thứ hai và thứ ba :Tôi chỉ định rằng phạm vi nằm trong khoảng từ 1 đến 12. Trong trường hợp này, đối số thứ hai của tôi là 1 và đối số thứ ba là 12.
  • Đối số đầu tiên :Giá trị này được so sánh với đối số thứ hai và thứ ba, để biết nó nên được gán cho nhóm nào trong số ba nhóm. Trong ví dụ của tôi, tôi gọi width_bucket() ba lần để minh họa khái niệm tốt hơn. Tôi làm điều này để có thể cung cấp ba giá trị khác nhau làm đối số đầu tiên, mỗi giá trị được gán cho một nhóm khác nhau.

Bảng sau cung cấp một cách khác để hình dung điều này:

Giá trị Nhóm
1, 2, 3, 4 Nhóm 1
5, 6, 7, 8 Nhóm 2
9, 10, 11, 12 Nhóm 3

Vì vậy, chúng ta có thể thấy rằng nhóm đầu tiên chấp nhận các giá trị từ 1 đến 4, nhóm thứ hai từ 5 đến 8 và nhóm thứ ba dành cho các giá trị từ 9 đến 12.

Nếu tôi thay đổi nó để có bốn nhóm, mã của tôi có thể trông giống như sau:

SELECT 
  width_bucket(3, 1, 12, 4),
  width_bucket(5, 1, 12, 4),
  width_bucket(9, 1, 12, 4);

Và bảng sẽ như thế này:

Giá trị Nhóm
1, 2, 3 Nhóm 1
4, 5, 6 Nhóm 2
7, 8, 9 Nhóm 3
10, 11, 12 Nhóm 4

Ngoài phạm vi

Nếu đầu vào nằm ngoài phạm vi của nhóm, bạn sẽ nhận được 0 hoặc số lượng +1, tùy thuộc vào việc đầu vào nằm dưới phạm vi hay cao hơn phạm vi đó.

Ví dụ:

SELECT 
  width_bucket(-3, 1, 12, 3),
  width_bucket(20, 1, 12, 3);

Kết quả:

 width_bucket | width_bucket
--------------+--------------
            0 |            4

Ví dụ - Cú pháp thứ ba

Để chứng minh cú pháp thứ ba, hãy lấy ví dụ đầu tiên ở trên và sửa đổi nó để sử dụng cú pháp thứ ba:

SELECT 
  width_bucket(3, array[1, 4, 8]),
  width_bucket(5, array[1, 4, 8]),
  width_bucket(9, array[1, 4, 8]);

Kết quả:

 width_bucket | width_bucket | width_bucket
--------------+--------------+--------------
            1 |            2 |            3

Ở đây tôi đã tạo 3 nhóm và gán các giá trị rõ ràng cho mỗi nhóm. Trong trường hợp này, tất cả chúng đều là các nhóm có chiều rộng bằng nhau, nhưng đó không phải là một yêu cầu.

Lợi ích chính của cú pháp thứ ba là nó cho phép bạn tạo các nhóm có chiều rộng không bằng nhau.

Ví dụ:tôi có thể sửa đổi ví dụ trước thành thế này:

SELECT 
  width_bucket(3, array[1, 3, 12]),
  width_bucket(5, array[1, 3, 12]),
  width_bucket(9, array[1, 3, 12]);

Kết quả:

 width_bucket | width_bucket | width_bucket
--------------+--------------+--------------
            2 |            2 |            2

Làm điều này sẽ thay đổi các nhóm mà mỗi số được chỉ định. Bây giờ, tất cả những con số đó đều thuộc nhóm thứ hai.

Cú pháp thứ ba có thể hữu ích cho nhiều trường hợp sử dụng. Ví dụ:bạn có thể có nhiều nhóm tuổi không được phân bổ đồng đều.

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)";

Kết quả:

 Age Group (15) | Age Group (45) | Age Group (50)
----------------+----------------+----------------
              1 |              3 |              4

Ngoài phạm vi

Hàm trả về 0 nếu đầu vào nhỏ hơn giới hạn dưới đầu tiên.

Ví dụ:

SELECT width_bucket(8, array[10, 40, 30]);

Kết quả:

0

Width_Bucket () so với CASE

Các ví dụ trên trang này cũng có thể được thực hiện bằng cách sử dụng CASE tuyên bố. Sự khác biệt là width_bucket() làm điều đó theo cách ngắn gọn hơn.

Đây là cách chúng tôi có thể viết lại ví dụ trước bằng cách sử dụng CASE tuyên bố.

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;

Kết quả:

0

Hãy nhớ rằng thông thường đầu vào trong tất cả các ví dụ này sẽ là một biến hoặc tên cột chứ không phải là một hằng số.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. lỗi lệnh sử dụng alembic không thể tìm thấy mã định danh

  2. postgresql - sql - số giá trị `true`

  3. Cách make_time () hoạt động trong PostgreSQL

  4. Trình điều khiển QPSQL không được tải Qt

  5. Các giải pháp DBaaS tốt nhất cho PostgreSQL