Hàm RANKX

DAX: Hàm RANKX và những điều có thể bạn chưa biết

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

Nối tiếp chuỗi các bài viết về các hàm DAX thông dụng, hôm nay chúng ta sẽ cùng tiếp cận một hàm giúp xếp hạng các giá trị trong bảng dữ liệu, đó là hàm RANKX. Ngoài những tính năng cơ bản của hàm, chúng mình cũng sẽ hướng dẫn các bạn những cách viết mở rộng cho những tình huống nâng cao hơn nhé. 

Cách dùng của hàm RANKX 

1. Chức năng 

Hàm RANKX dùng để xếp hạng dữ liệu trong một bảng theo một tiêu chí cụ thể. Nó cho phép bạn đánh giá và xếp hạng các giá trị dựa trên các biểu thức hoặc giá trị của cột khác trong bảng dữ liệu.   

2. Syntax 

RANKX(<table>, <expression>[, <value>[, <order>[, <ties>]]]) 

Trong đó: 

  • Table (tham số bắt buộc): là bảng dữ liệu mà bạn muốn áp dụng hàm RANKX để sắp xếp 
  • Expression (tham số bắt buộc): là biểu thức hoặc một cột trong bảng dữ liệu, được sử dụng để xác định tiêu chí xếp hạng. 
  • Value (tham số tùy chọn): là giá trị bạn muốn xếp hạng. 
  • Order (tham số tùy chọn): là tham số để xác định thứ tự sắp xếp của kết quả xếp hạng, từ cao đến thấp hoặc từ thấp đến cao. Nếu bạn bỏ qua không chọn, tham số này mặc định là DESC (giảm dần), nếu bạn chọn ASC thì giá trị sẽ sắp xếp tăng dần. 
  • Ties (tham số tùy chọn): là tham số để thể hiện cách xử lý các giá trị trùng nhau trong xếp hạng. 
Ties Type Giải thích 
Skip Nếu bỏ qua thì mặc định là SKIP.  Nếu gặp những giá trị trùng nhau, dữ liệu sẽ tự động nhảy đến N giá trị đó. Ví dụ: nếu có ba giá trị “5” trùng nhau thì giá trị kế tiếp sẽ là “8” (5+3) 
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. Ví dụ: nếu có ba giá trị “5” trùng nhau thì giá trị kế tiếp sẽ là 6 (giá trị liền kề tiếp theo) 

Ví dụ: Sắp xếp thứ tự SubCategory theo thứ tự giảm dần của cột Sales Amount như bên dưới:

Cách dùng của hàm RANKX 

Để thực hiện điều này, đầu tiên mình sẽ áp dụng syntax ở trên để tạo ra 1 measure như sau:

Nhưng rất tiếc, kết quả trả ra lại không giống như chúng ta mong muốn.

Cách dùng của hàm RANKX 

Vì sao lại như thế? Đó là do cơ chế xử lý của hàm RANKX.

Hàm RANKX hoạt động theo ba bước sau: 
– Tạo bảng tra cứu bằng cách lặp lại đối số đầu tiên và đánh giá đối số thứ hai trong ngữ cảnh hàng do phép lặp tạo ra. Bảng tra cứu sau đó được sắp xếp theo thứ tự giảm dần (theo mặc định, điều này có thể được thay đổi) (1). 
– Tính toán đối số thứ hai bên ngoài phép lặp, công thức sẽ được tính toán trong ngữ cảnh của bộ lọc (2). 
– Tìm kiếm vị trí đặt kết quả của (2) trong bảng tra cứu được tính trong quá trình (1), theo thứ tự sắp xếp đã chọn trong quá trình (1). 

Vì vậy, nếu chúng ta viết công thức như trên, khi đó số 1 được xem là 1 VALUES, đối với mỗi ô nó chỉ trả về một bảng có một hàng. Do đó, bảng tra cứu chỉ chứa một hàng có doanh số của SubCategory hiện có. Do đó, kết quả luôn là 1. Chúng ta cần dùng hàm ALL và viết lại công thức đúng như sau:

Những điều có thể bạn chưa biết về hàm RANKX 

  1. Tình huống 1:  

Chúng ta cũng có một bảng dữ liệu bao gồm SubCategory và Sales Amount tương ứng. Lúc này, chúng mình tạo thêm 1 Slicer bên ngoài để lọc các SubCatgory như bên dưới:

Ví dụ về hàm RANKX

Các bạn có thấy điều vô lý ở đây là khi mình chỉ chọn một số SubCategory thì cột xếp hạng Rankx không sắp xếp giới hạn trong các SubCategory này mà vẫn giữ nguyên cách xếp hạng so với toàn bộ SubCategory.

Về mặt trình bày dữ liệu, cách sắp xếp này sẽ không có ý nghĩa khi chỉ có 4 giá trị được chọn mà cột xếp hạng lại trả về đến thứ hạng 12. Mong muốn của mình là khi mình chọn bao nhiêu SubCatgory thì cột thứ tự sẽ sắp xếp tương ứng theo các SubCategory đó. 

Cách giải quyết tình huống này là kết hợp hàm ALLSELECTED như sau: 

Và đây là kết quả: 

Ví dụ về hàm RANKX 1

Ngoài ra, nếu không muốn giá trị 1 xuất hiện ở dòng Total thì chúng ta sẽ hiệu chỉnh lại công thức như sau:

Công thức kết hợp với hàm ISINSCOPE có ý nghĩa nếu cột SubCategory có tham gia vào gom nhóm thì mới đánh số thứ tự cho nó, ngược lại thì không tính. 

  1. Tình huống 2 

Chúng ta cũng có một bảng dữ liệu bao gồm SubCategory và Sales Amount tương ứng. Lúc này, mình tạo thêm một bảng SaleAmount Range như bên dưới: 

Ví dụ về hàm RANKX 2

Ý nghĩa của bảng SalesAmount Range này là nếu SalesAmount có giá trị từ 0-100,000 thì sẽ đánh thứ tự 5; trên 100,000-200,000 thì sẽ đánh thứ hạng 4, tương tự như vậy đến giá trị trên 20,000,000 sẽ đánh thứ tự 1. 

Yêu cầu: sắp xếp thứ tự bảng dữ liệu theo bảng SaleAmount Range.

Chúng ta sẽ viết công thức như sau: 

Lúc này, bảng tra của chúng ta không còn là bảng Product nữa mà thay bằng SaleAmount Range, cột dùng để tra lúc này là cột Value và giá trị dùng để đối chiếu là SalesAmount. Kết quả chúng ta thu được sẽ như sau: 

Ví dụ về hàm RANKX 3

Kết luận 

RANKX là một hàm cực kỳ hữu dụng trong DAX để xếp hạng các giá trị trong bảng dữ liệu. RANKX dựa trên các khái niệm về chuyển đổi ngữ cảnh, lặp lại ngữ cảnh hàng và ngữ cảnh bộ lọc. Đây là những chủ đề cơ bản của DAX mà chúng ta sẽ tìm thấy ở mọi nơi, do đó bạn cần học và nắm vững.

Bài viết liên quan: Hàm RANK và sự vượt trội so với hàm RANKX

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 *