Hàm RANK và RANKX

DAX: Hàm RANK và sự khác biệt so với hàm RANKX

Ngày đăng: 12/07/2023

Hàm RANK và RANKX đều là hàm dùng để xếp hạng trong ngôn ngữ DAX. Nếu như hàm RANKX đã được sử dụng từ lâu và khá phổ biến trong những trường hợp liên quan đến ngữ cảnh cần được xếp hạng thì hàm RANK lại là “tân binh” vừa được Microsoft ra mắt vào tháng 06/2023 vừa qua.

Vậy “tân binh” RANK này có đặc điểm nào ưu việt hơn hoặc sẽ được sử dụng trong các trường hợp nào? Chúng ta hãy cùng tìm hiểu trong bài viết dưới dây nhé. 

Cách sử dụng hàm RANK và RANKX

Datapot đã có một bài viết rất chi tiết về RANKX, các bạn có thể tìm đọc tại đây.

Trong bài viết lần này, chúng mình sẽ tập trung giới thiệu về hàm RANK. 

1. Chức năng

Hàm RANK thuộc nhóm Window Functions, dùng để xếp hạng dữ liệu trong một ngữ cảnh cụ thể. Hàm sẽ sắp xếp thứ tự theo chiều được chỉ định trong một phân vùng xác định.

2. Syntax – Cú pháp

RANK ( [<ties>][, <relation>][, <orderBy>][, <blanks>][, <partitionBy>][, <matchBy>] ) 

Trong đó: 

Thông số Giải thích 
Ties – tham số tùy chọn Đây là tham số để thể hiện cách xử lý các giá trị trùng nhau trong xếp hạng. Nếu được chỉ định, giá trị được hỗ trợ là DENSE hoặc SKIP. Nếu bỏ qua thì mặc định là SKIP. Trong đó:
– SKIP: Nếu gặp những giá trị trùng nhau, dữ liệu sẽ tự động nhảy đến N giá trị đó.
– DENSE: Nếu gặp những giá trị trùng nhau, dữ liệu sẽ chỉ nhảy đến giá trị liền kề kế tiếp.
Relation – tham số tùy chọn Là bảng chứa những dòng dữ liệu được trả về. Nếu được chỉ định, tất cả các cột trong <orderBy> và <partitionBy> phải đến từ bảng này. 
Nếu bỏ qua: 
– <orderBy> phải được chỉ định bằng một cột giá trị khác. 
– Tất cả các cột <orderBy> và <partitionBy> phải đủ điều kiện và đến từ một bảng duy nhất.  
Order By – tham số tùy chọn Mệnh đề ORDERBY() chứa các cột xác định cách sắp xếp từng phân vùng. 
Nếu bỏ qua thì: 
– <relation> phải được chỉ định một bảng rõ ràng. 
– Mặc định sắp xếp theo từng cột trong <relation>, cái mà chưa được chỉ định trong <partitionBy>.  
Blanks – tham số tùy chọn Tùy chọn cách sắp xếp các giá trị trống. Nếu bỏ qua, mặc định sẽ là FIRST: khi đó các ô trống luôn được sắp xếp ở đầu, bất kể thứ tự sắp xếp tăng dần hay giảm dần. Nếu chọn LAST, các ô trống luôn được sắp xếp ở cuối, bất kể thứ tự sắp xếp tăng dần hay giảm dần.  
Partition By – tham số tùy chọn Mệnh đề PARTITIONBY() chỉ định các cột dùng để xác định <relation> được phân vùng như thế nào. Nếu bỏ qua, <relation> được coi là một phân vùng duy nhất.  
MatchBy – tham số tùy chọn Mệnh đề MATCHBY() chứa các cột dùng để xác định cách so sánh dữ liệu và xác định hàng hiện tại.  

Ví dụ 1: Sắp xếp thứ tự SubCategory theo Doanh số được làm tròn như bảng sau: 

Ví dụ sử dụng hàm RANK

Hoặc

Ví dụ 2: Sắp xếp thứ tự SubCategory theo Doanh số được làm tròn. Nếu Subcategory nào có Doanh số bằng nhau thì sắp xếp theo tên SubCategory. Cụ thể, theo ví dụ 1 ở trên, “Helmets” & “Tires and Tubes” là hai Subcategory có Doanh số bằng nhau thì chúng ta sẽ xét đến tên của hai SubCategory. Hãy chú ý đến bảng bên dưới: 

Ví dụ hàm RANK

Sắp xếp thứ tự theo nhiều cột là điểm mạnh của hàm RANK, điều này nếu thực hiện ở hàm RANKX sẽ khá phức tạp. Chúng ta có thể viết hàm RANK để sắp xếp theo nhiều cột như sau:

Vậy nhưng liệu cách viết hàm RANK như ví dụ 1 và 2 có phải là cách viết tối ưu nhất hay chưa?  

Mặc dù nó vẫn trả ra đúng kết quả cho chúng ta nhưng chúng mình vẫn đề xuất bạn không nên viết theo dạng “full syntax” như vậy. Bởi vì hàm RANK thuộc gia đình Window Function nên cách tốt nhất để viết những công thức liên quan đến hàm RANK là đặt một biến thay thế (VAR) để tính toán trước các giá trị . Lúc đó, chúng ta sẽ viết lại công thức như sau: 

Lý do chính để viết lại công thức theo cách này là sẽ khiến chúng ta dễ đọc hơn và hiểu rõ nội dung của bảng nguồn cũng như cách tính của cột được xếp hạng. Bằng cách xem nội dung của SourceTable, rõ ràng là cột “Amt” được tính toán trong ngữ cảnh bộ lọc hiện tại và trong đó cột duy nhất bị ghi đè là Subcategory.  

Ví dụ 3: Chúng ta cần tạo một measure dùng để xếp hạng Doanh số theo SubCategory và được gom nhóm theo từng Category như hình bên dưới:

Hàm RANK và hàm RANKX

Chúng ta sẽ viết công thức như bên dưới:

Giải thích: Đầu tiên mình sẽ tạo ra một bảng tra SourceTable bằng hàm Summarize, đây là hàm dùng để tạo ra một bảng mới từ những bảng có sẵn khác. Sau đó, mình dùng hàm RANK để sắp xếp thứ tự và gom thành từng nhóm Category. 

So sánh hàm RANK và RANKX

  1. Vì thuộc gia đình Window Functions, hàm RANK có khả năng sắp xếp theo nhiều cột như một tính năng gốc nên việc xếp hạng đa cột sẽ thuận lợi hơn hàm RANKX (như ví dụ 2). 
  1. Trong tình huống sau đây, hàm RANK có thể xử lý mượt mà và đơn giản hơn hàm RANKX.
So sánh hàm RANK và RANKX
So sánh hàm RANK và RANKX 2

Mình đã sử dụng hàm RANKX để viết công thức cho cột Rankx ở 2 bảng trên như sau: 

Chúng ta có thể nhận ra rằng kết quả trên đã đưa ra những giá trị không như mong muốn, số 1 không nên xuất hiện ở những vị trí được khoanh đỏ vì sẽ không đem lại ý nghĩa cho bảng dữ liệu. Để khắc phục điều này, chúng ta có thể xử lý bằng cách kết hợp với hàm ISINSCOPE hoặc HASONEVALUE (tham khảo lại bài viết về RANKX). Tuy nhiên, cách xử lý này sẽ khá cồng kềnh và phức tạp. Nhưng khi chúng ta sử dụng hàm RANK thì mọi việc sẽ dễ dàng hơn rất nhiều. Cùng xem sự so sánh như bên dưới nhé: 

hàm RANK_1
hàm RANK_2

Kết luận

RANK là một chức năng làm cho việc xếp hạng một hoặc nhiều cột trở nên đơn giản. Nó thể hiện sự nhất quán hơn khi xếp hạng, cái mà không được hiển thị trực tiếp trong báo cáo và nó làm giảm số lỗi có thể xảy ra trong công thức DAX của bạn.

Mặc dù không phải là sự thay thế hoàn toàn cho RANKX, nhưng nó phù hợp trong hầu hết các tình huống, khiến RANK trở thành chức năng xếp hạng tốt nhất hiện có trong các hàm DAX. 

Bài viết liên quan:

Hàm ORDERBY và PARTITIONBY trong DAX trong Power BI

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *