Giải thích về Lineage trong DAX: Nguồn gốc và cách thao tác dữ liệu
Lineage là một trong những khái niệm quan trọng nhất trong DAX, liên quan đến thông tin về nguồn gốc của dữ liệu. Bài viết này sẽ khám phá lineage là gì, cách thiết lập, xóa bỏ và thao tác với nó để tối ưu hóa các truy vấn Power BI.

Trong DAX (Data Analysis Expressions), Lineage (nguồn gốc dữ liệu) là một khái niệm cốt lõi mà mọi nhà phát triển cần phải nắm vững. Nó về cơ bản là thông tin về nguồn gốc của một giá trị hoặc cột dữ liệu, cho phép công cụ DAX hiểu được mối liên kết giữa dữ liệu được tính toán và các cột gốc trong mô hình dữ liệu. Việc hiểu rõ lineage giúp bạn viết mã hiệu quả hơn và tránh các lỗi khó hiểu khi làm việc với Power BI.
Kết quả truy vấn cơ bản trong DAX
Thiết lập Lineage với TREATAS
Khi làm việc với các biến trong DAX, đôi khi chúng ta cần chuyển ngữ cảnh của một giá trị này sang một cột khác. Hàm TREATAS là công cụ mạnh mẽ để làm điều này; nó áp dụng lineage của một bảng hoặc cột này cho một cột khác.
Ví dụ, thay vì viết điều kiện lọc trực tiếp như 'Date'[MonthKey] = 202604, chúng ta có thể định nghĩa một biến và sử dụng TREATAS để gán lineage cho nó:
DEFINE
VAR YearMonthFilter = TREATAS({ 202604 }, 'Date'[MonthKey])
EVALUATE
CALCULATETABLE(
SUMMARIZECOLUMNS(
'Date'[Year],
'Date'[MonthShortName],
'Date'[MonthKey],
'Product'[ProductCategoryName],
"Order Count", [Online Order Count]
),
'Product'[BrandName] = "Adventure Works",
YearMonthFilter
)
Cách tiếp cận này giúp mã gọn gàng hơn và là cách Power BI tự động tạo mã khi chuyển các bộ lọc từ báo cáo sang mô hình ngữ nghĩa.
Sử dụng hàm TREATAS để thiết lập lineage
Xóa bỏ Lineage
Có những lúc bạn cần loại bỏ lineage khỏi một biến, biến nó thành một giá trị vô hướng (scalar value) đơn thuần không còn liên kết với cột gốc. Điều này thường xảy ra khi bạn thực hiện các phép toán số học hoặc sử dụng các hàm chuyển đổi cụ thể.
Nếu bạn cố gắng sử dụng một biến đã mất lineage làm bộ lọc trực tiếp trong CALCULATETABLE, DAX sẽ báo lỗi vì không biết áp dụng giá trị đó vào cột nào. Để khắc phục, bạn phải sử dụng cú pháp so sánh rõ ràng (ví dụ: 'Date'[MonthKey] = BienDaXoaLineage).
Một cách thú vị để xóa lineage khi làm việc với nhiều giá trị là sử dụng hàm VALUES. Khi áp dụng VALUES lên một biến có lineage, nó sẽ trả về một bảng các giá trị nhưng đã mất kết nối gốc, buộc bạn phải sử dụng toán tử IN trong bộ lọc:
'Date'[MonthKey] IN YearMonthFilter_cleared
Thao tác và chuyển đổi Lineage
Một trong những ứng dụng hữu ích của lineage là khả năng chuyển đổi ngữ cảnh lọc từ bảng này sang bảng khác mà không cần dùng biến trung gian. Giả sử bạn muốn lọc số đơn hàng theo quốc gia của khách hàng, nhưng sau đó áp dụng bộ lọc đó cho bảng cửa hàng (Store) để xem các cửa hàng ở quốc gia đó phục vụ bao nhiêu đơn hàng.
Thay vì lưu quốc gia vào biến rồi lọc lại, bạn có thể dùng TREATAS để chuyển đổi lineage trực tiếp từ cột Customer[RegionCountryName] sang Store[RegionCountryName]:
MEASURE 'All Measures'[Orders served from Country] =
CALCULATE(
[Online Order Count],
REMOVEFILTERS(Customer[RegionCountryName]),
TREATAS(VALUES('Customer'[RegionCountryName]), 'Store'[RegionCountryName])
)
Phương pháp này ngắn gọn hơn nhiều, giúp mã DAX trở nên "sạch" và dễ đọc hơn, mặc dù đòi hỏi người đọc phải hiểu rõ cách TREATAS hoạt động.
Kết quả truy vấn sau khi thao tác lineage
Kết luận
Khái niệm Lineage trong DAX có thể trừu tượng và khó nắm bắt lúc đầu, nhưng nó là nền tảng của cách các bộ lọc hoạt động trong Power BI. Việc biết cách thao tác lineage không chỉ giúp bạn viết mã ngắn gọn hơn mà còn quan trọng để tránh các lỗi phụ thuộc vòng tròn (circular dependency) khi tạo bảng bằng DAX.
Mặc dù việc thay đổi cách viết code dựa trên lineage có thể không mang lại cải thiện đáng kể về hiệu suất thực thi, nhưng nó mang lại giá trị lớn trong việc duy trì và đọc hiểu mã nguồn. Hãy thử nghiệm với các kỹ thuật trên để tối ưu hóa các biểu thức DAX của bạn.



