Tổng hợp dữ liệu 2 bước với hàm Aggr trong Qlik

BI dashboard nhìn chung được thiết kế nhằm mục đích trình bày một cách trực quan và cô đọng các số liệu tổng quát từ dữ liệu chi tiết của các hệ thống nghiệp vụ. Vì vậy, hầu hết BI dashboard đều phải ít nhiều sử dụng các hàm hàm tổng hợp (aggregate) dữ liệu.

Aggregate là phép tính ra kết quả duy nhất từ một tập hợp các giá trị dữ liệu. Trong đó, thường gặp nhất là các hàm aggregate phổ biến như Sum, Avg, Max, Min – được hỗ trợ trong gần như tất cả các phần mềm phân tích dữ liệu. Các phép tính này đủ dùng cho yêu cầu tổng hợp dữ liệu đơn giản như “tính tổng doanh thu trong năm”.

Tuy nhiên, quá trình phân tích dữ liệu thường đặt ra những yêu cầu tổng hợp phức tạp hơn, ví dụ như “tính doanh thu của mặt hàng bán chạy nhất theo từng công ty“. Bản chất của phép tính này là một quá trình tổng hợp 2 bước ở số liệu của mỗi công ty:

  1. Tính tổng doanh thu theo từng mặt hàng
  2. Lấy số lớn nhất trong các kết quả của bước 1

Trong QlikView và Qlik Sense, phép tính tổng hợp dữ liệu qua 2 bước như trên được thực hiện với hàm Aggr( ). Đây là một trong những hàm aggregation mạnh nhất của Qlik engine với rất nhiều ứng dụng thú vị. Bài viết sau đây của VietQlikies sẽ thảo luận sâu hơn về hàm Aggr và các lưu ý khi sử dụng hàm này trong quá trình thiết kế Qlik dashboard.

Công dụng của hàm Aggr

Trước hết bạn cần phân biệt tên hàm Aggr với thuật ngữ “aggregation function” trong Qlik – 2 khái niệm này thường gây nhầm lẫn vì có cách đọc khá giống nhau. Như có nói ở đầu bài, “aggregation function” (hàm tổng hợp) là khái niệm để chỉ các hàm nhận đầu vào là 1 tập dữ liệu và trả về 1 con số duy nhất (n in, 1 out), như Max, Min, Avg, v.v. “Aggregation function” được dùng để phân biệt với “scalar function” (hàm đơn nhất), là các hàm nhận vào 1 giá trị và trả về 1 giá trị (1 in, 1 out). Char(…) là một ví dụ về scalar function: nó nhận vào 1 số nguyên và trả về ký tự trong bảng mã ASCII tương ứng với số nguyên đó.

Bạn có thể hình dung hàm Aggr() trong Qlik tương tự với từ khóa GROUP BY trong ngôn ngữ truy vấn SQL. Aggr là một hàm khá đặc biệt trong Qlik vì nó không trả về một giá trị duy nhất như các hàm aggregation thông thường, mà là một tập các giá trị được gom nhóm theo một hoặc một vài dimension nhất định.

Ví dụ, với yêu cầu tính “doanh thu của mặt hàng bán chạy nhất” ở đầu bài, với SQL, bạn sẽ cần viết một câu truy vấn như sau (ở đây ta định nghĩa mặt hàng bán chạy nhất = mặt hàng có tổng doanh thu cao nhất):

SELECT Max(TotalSales)
FROM (SELECT Sum(Sales) as TotalSales 
      FROM SalesData
      GROUP BY Product);

Trong Qlik Sense, bạn có thể dùng hàm Aggr để xây dưng biểu thức tương đương với câu lệnh SQL trên

=Max(Aggr(Sum(Sales),Product))

Trông có vẻ hơi phức tạp một chút phải không nào? Thực tế thì nếu theo dõi thường xuyên các thảo luận trên Qlik Community, bạn sẽ gặp những biểu thức sử dụng hàm Aggr còn “khủng khiếp” hơn nhiều, với nhiều lớp Aggr xen lẫn Set Analysis, ví dụ

=Max({<year={$(=max(year)-1)}>} Aggr(Sum({<year={$(=max(year)-1)}>} Sale), Company_Name, Product))

Dù trong biểu thức đơn giản hay phức tạp, vì được thiết kế để thực hiện các phép tính tổng hợp dữ liệu 2 bước, hàm Aggr thường được sử dụng với cấu trúc sau:

=Function1 (Aggr (Function2 (...) ,Dimension1,Dimension2,...)

Trong đó:

  • Function1 Function2 là các hàm aggregation thông thường như Sum, Avg, Max, Min, Only, MaxString, … Function1 Function2 có thể là cùng 1 hàm hoặc 2 hàm khác nhau tùy vào yêu cầu phân tích
  • Dimension1, Dimension2,… là các chiều dữ liệu mà trên đó việc gom nhóm được thực hiện. Trong câu lệnh SQL tương đương, đây chính là các field dữ liệu theo sau từ khóa GROUP BY.

Cách thức hoạt động của hàm Aggr trong bộ nhớ

Khi gặp một biểu thức chứa hàm Aggr, Qlik engine sẽ tạo ra một bảng tạm trong bộ nhớ. Bảng này có dimension là các cột (Dimension1, Dimension2,…) trong tham số của hàm Aggr, và measure là Function2 . Vì vậy, bản thân hàm Aggr trả về một tập các kết quả của Function2 tương ứng với mỗi bộ giá trị duy nhất của các group by dimension. Tập kết quả này sau đó được dùng làm đầu vào cho Function1để trả về một kết quả tổng hợp duy nhất.

Như mọi biểu thức khác, hàm Aggr cũng chịu ảnh hưởng của ngữ cảnh dữ liệu trong bảng và biểu đồ hiện tại. Vì vậy, khi sử dụng trong bảng có sẵn các dimension, Qlik engine sẽ tạo ra một bảng tạm cho mỗi dòng trong bảng.

Quay lại ví dụ ban đầu, giả sử ta có bảng dữ liệu đơn giản trong hình sau và cần tạo một table object với dimension là Company và measure là biểu thức =Max(Aggr(Sum(Sales),Product)) . Quá trình tính toán của Qlik engine diễn ra như sau:

  1. Phần Aggr(Sum(Sales), Product) được xử lý trước. Ở bước này, với mỗi giá trị của Company (Apple, Samsung), Qlik engine tạo ra một bảng tạm chứa 2 cột: Product, Sum(Sales).
  2. Các giá trị Sum(Sales) được dùng làm đầu vào cho hàm Max ở ngoài cùng. Kết quả trả về là một giá trị duy nhất cho mỗi Company

Một số lưu ý khi sử dụng hàm Aggr

Lựa chọn các hàm tổng hợp dùng với Aggr

Có nhiều trường hợp bạn sẽ cần dùng 2 hàm tổng hợp giống nhau ở trong và ngoài hàm Aggr, ví dụ như Sum(Aggr(Sum(…)). Biểu thức này không mang nhiều ý nghĩa nếu 2 hàm Sum chỉ được dùng ở dạng đơn giản. Ở ví dụ trên, Sum(Sales)Sum(Aggr(Sum(Sales),Product)) cho ra kết quả như nhau vì tính tổng một lần hay tổng từng thành phần rồi cộng lại cũng đều ra một giátrị duy nhất. Tương tự với các hàm aggregation khác như Max hay Min.

Sum(Aggr(Sum(…)) được dùng khi phạm vi của các phép toán tổng hợp ở trong và ngoài hàm Aggr được điều chỉnh bằng Set Analysis, từ khóa TOTAL hoặc điều kiện IF

Vấn đề hiệu suất khi sử dụng hàm Aggr

Hàm Aggr sử dụng nhiều tài nguyên hệ thống, đặc biệt là khi sử dụng trên dataset rất lớn vì phải tạo ra các bảng tạm trong bộ nhớ như trình bày ở trên. Vì vậy, để tăng cường hiệu suất của dashboard, bạn cần cân nhắc kĩ khi nào cần sử dụng Aggr. Trong nhiều trường hợp, thay vì dùng hàm Aggr trên dashboard, bạn có thể xem xét các lựa chọn thay thế sau:

Ví dụ, giả sử người sử dụng dashboard chỉ cần xem sản phẩm có doanh thu cao nhất của Apple mà không cần so sánh với các công ty khác như Samsung. Trong trường hợp này bạn hoàn toàn có thể tạo bảng hoặc bar chart chứa dimension là Product và measure là biểu thức đơn giản =Sum(Sales), được sort giảm dần theo measure. Khi lựa chọn một công ty từ filter pane Company, người sử dụng có thể nhanh chóng xem được sản phẩm có doanh thu cao nhất trong bảng.

Ngoài công dụng tổng hợp dữ liệu 2 bước như trình bày ở trên, nhờ đặc tính trả về một tập giá trị, hàm Aggr còn có thể được sử dụng cho nhiều mục đích khác như tạo các chiều dữ liệu thứ cấp (calculated dimension), tạo chuỗi tìm kiếm dùng trong Set Analysis. Do bài viết hiện tại đã dài, VietQlikies sẽ giới thiệu các ứng dụng thú vị của hàm Aggr trong một bài viết khác.

Bình luận về bài viết này