Hàm ARRAY_AGG (JSON_ARRAYAGG), ARRAY_DISTINCT trong SQL và ví dụ cụ thể

by hanhtm2
321 views

Xin chào mọi người, hôm nay mình sẽ chia sẻ với các bạn về hàm ARRAY_AGG (JSON_ARRAYAGG), ARRAY_DISTINCT trong SQL và ví dụ cụ thể để truy vấn dữ liệu.

Chúng ta có 1 bảng dữ liệu như sau:

Table_cus

Đề bài: Tổng hợp các giá trị bao gồm cả giá trị NULL trong cột Cus_rank thành một mảng (group by id). Loại bỏ các giá trị trùng lặp trong mảng đó.

Để giải quyết được bài toán trên chúng ta sẽ phải sử dụng đến hàm ARRAY_AGG, vậy hàm ARRAY_AGG có chức năng gì?

1. Chức năng hàm ARRAY_AGG

Cú pháp:

ARRAY_AGG(expression [ORDER BY [sort_expression {ASC | DESC}], [...])

Chức năng: tổng hợp tập hợp các giá trị bao gồm NULL trong một cột thành một mảng

Chi tiết:

  • ARRAY_AGG() nhận một biểu thức trả về giá trị thuộc bất kỳ loại nào hợp lệ cho một phần tử mảng.
  • Mệnh đề ORDER BY là mệnh đề tùy chọn. Nó chỉ định thứ tự các hàng được xử lý trong tập hợp, xác định thứ tự của các phần tử trong mảng kết quả.
  • Tương tự như các hàm tổng hợp khác như AVG(), COUNT(), MAX(), MIN() và SUM(), ARRAY_AGG() thường được sử dụng với mệnh đề GROUP BY.

Chú ý:

  • Thứ tự của các phần tử trong mảng là ngẫu nhiên.
  • Kiểu dữ liệu của các phần tử trong mảng trả về giống với kiểu dữ liệu của các giá trị trong cột.

2. Giải toán

Chúng ta cùng nhau đi giải quyết từng yêu cầu của bài toán trên nhé!

  • Đối với yêu cầu ‘Tổng hợp các giá trị bao gồm cả giá trị NULL trong cột Cus_rank thành một mảng (group by id)’ chúng ta sử dụng hàm ARRAY_AGG() để thực hiện truy vấn như sau:

Select id, ARRAY_AGG(cus_rank) as cus_rank_1 from Customer group by id;

Tuy nhiên, trong MySQL Workbench lại không hỗ trợ hàm ARRAY_AGG => chúng ta sẽ thay thế bằng hàm JSON_ARRAYAGG như sau:

Select id, JSON_ARRAYAGG(cus_rank) as cus_rank_1 from Customer group by id;

Kết quả trả về như sau:

array_2

  • Đối với case Loại bỏ các giá trị trùng lặp trong mảng, thường chúng ta sẽ sử dụng hàm array_distinct:

Cú pháp: array_distinct(array) - Removes duplicate values from the array.

Tuy nhiên, trong MySQL Workbench JSON_ARRAYAGG() không hỗ trợ DISTINCT. Bạn có thể SELECT DISTINCT trong truy vấn subquery và sau đó tổng hợp, như sau:

SELECT id, JSON_ARRAYAGG(cus_rank) AS cus_rank_1 FROM (SELECT DISTINCT id, cus_rank from Customer) a GROUP BY id;

Kết quả trả về như sau:

array_3

Trên đây là một vài chia sẻ của mình, nếu các bạn có cách làm nào hay, đừng ngần ngại comment nhé. Hẹn gặp lại mọi người trong bài viết tiếp theo.

Tài liệu tham khảo:

Leave a Comment

* By using this form you agree with the storage and handling of your data by this website.

You may also like