1.   Giới thiệu về DAX Time Intelligence

Time Intelligence trong DAX là tập hợp các hàm mạnh mẽ giúp phân tích dữ liệu theo thời gian một cách trực quan và hiệu quả. Trong Power BI, các hàm này hỗ trợ:

  • Tính toán KPIs dựa trên thời gian.
  • So sánh dữ liệu giữa các khoảng thời gian cụ thể (năm trước, quý trước).
  • Phân tích xu hướng qua các khung thời gian như ngày, tháng, quý, năm.

DAX Time Intelligence giúp tối ưu hóa phân tích dữ liệu, mang lại thông tin chi tiết và hỗ trợ ra quyết định chiến lược cho doanh nghiệp.

2. Điều kiện để sử dụng các hàm Time Intelligence

Để sử dụng hiệu quả các hàm Time Intelligence trong DAX, cần đáp ứng một số điều kiện cụ thể liên quan đến bảng ngày (Calendar Table hoặc Date Table). Bảng ngày là yếu tố cốt lõi để làm việc với dữ liệu thời gian, và cần đáp ứng các yêu cầu sau:

  • Bảng ngày liên tục và đầy đủ
    • Bảng ngày phải bao gồm tất cả các ngày trong khoảng thời gian phân tích, từ ngày đầu tiên đến ngày cuối cùng.
    • Bảng ngày phải luôn bắt đầu từ ngày 1 tháng 1 và kết thúc vào ngày 31 tháng 12 nếu phân tích dựa trên năm dương lịch.
  • Cột Ngày (Date Column)
    • Phải có một cột dạng Date, chứa các giá trị ngày duy nhất. Cột này thường được gọi là “Ngày” (Date) và được sử dụng để thiết lập mối quan hệ với các bảng dữ liệu khác.
    • Cột này cũng cần được đánh dấu là Bảng Ngày (Mark as Date Table) trong mô hình dữ liệu.
  • Mối quan hệ giữa bảng ngày và dữ liệu chính
    • Bảng ngày phải được liên kết với bảng dữ liệu chính thông qua một cột ngày tương ứng. Mối quan hệ này thường được thiết lập dưới dạng “Many-to-One” hoặc “One-to-Many”.

Việc thiết lập đúng bảng ngày không chỉ là điều kiện tiên quyết để các hàm Time Intelligence hoạt động chính xác mà còn đảm bảo quá trình phân tích dữ liệu thời gian được thực hiện hiệu quả và chính xác.

3.   Phân biệt các hàm DAX Time Intelligence thường dễ nhầm lẫn với nhau

1. SAMEPERIODLASTYEAR và DATEADD

SAMEPERIODLASTYEAR:

Hàm này trả về tập hợp ngày chính xác cùng kỳ năm trước. Điều này nghĩa là nếu bạn đang làm việc với các ngày trong một phạm vi cụ thể, hàm sẽ giữ nguyên cấu trúc phạm vi đó nhưng lùi về năm trước.

Cú pháp:

SAMEPERIODLASTYEAR(<dates>)

Trong đó: dates là cột chứa dữ liệu ngày tháng mà bạn muốn tính toán.

Ví dụ: giả sử bạn muốn tính doanh thu cùng kỳ năm trước của ngày hiện tại (01/01/2021)

Doanh Thu Cùng Kỳ Năm Trước= CALCULATE(SUM(fact_sales[sales_amount]), SAMEPERIODLASTYEAR(dim_date[date]))

Hàm này trả về doanh thu cùng kỳ năm trước của ngày hiện tại trong bảng dữ liệu

DATEADD

DATEADD là một hàm dịch chuyển tập hợp ngày lên trước hoặc lùi lại một khoảng thời gian cụ thể (tháng, quý, năm).

Cú pháp:

DATEADD(<dates>,<number_of_intervals>,<interval>)

Trong đó:

Chỉ số Định nghĩa
dates Là một cột chứa dữ liệu ngày
number_of_intervals Số khoảng thời gian cần dịch chuyển (có thể là số âm hoặc dương)
interval Đơn vị thời gian: DAY, MONTH, QUARTER, YEAR.

+ Lùi một năm:

Ví dụ: giả sử bạn muốn tính doanh thu cùng kỳ năm trước của ngày hiện tại (01/01/2021)

Doanh Thu Cùng Kỳ Năm Trước = CALCULATE(SUM(fact_sales[sales_amount]), DATEADD(dim_date[date],-1,YEAR))

Hàm này cũng trả về doanh thu cùng kỳ năm trước của ngày hiện tại trong bảng dữ liệu tương tự như khi dùng SAMEPERIODLASTYEAR trong ví dụ này.

+ Lùi hai năm:

Ví dụ: giả sử bạn muốn tính doanh thu cùng kỳ 2 năm trước của ngày hiện tại (01/01/2022)

Doanh Thu Cùng Kỳ Năm Trước = CALCULATE(SUM(fact_sales[sales_amount]), DATEADD(dim_date[date],-2,YEAR))

Hàm này trả về doanh thu cùng kỳ 2 năm trước của ngày hiện tại trong bảng dữ liệu

Trường hợp sử dụng:

  • Dùng SAMEPERIODLASTYEAR khi bạn muốn dễ dàng so sánh cùng kỳ năm trước trong các báo cáo Year-over-Year.
  • Dùng DATEADD khi bạn cần lùi thời gian một cách linh hoạt (-1 năm, -2 năm, -5 năm,…)

2. DATESINPERIOD VÀ DATESBETWEEN

DATESINPERIOD

DATESINPERIOD là một hàm DAX dùng để trả về tập hợp ngày từ một mốc thời gian cụ thể, với khoảng thời gian được xác định bởi tham số (tính theo ngày, tháng, quý hoặc năm).

Cú pháp:

DATESINPERIOD(<dates>, <start_date>, <number_of_intervals>, <interval>)

Trong đó:

Chỉ số Định nghĩa
dates Là một cột chứa dữ liệu ngày
start_date Ngày bắt đầu của khoảng thời gian
number_of_intervals Số lượng khoảng thời gian, có thể âm hoặc dương
interval Đơn vị thời gian: DAY, MONTH, QUARTER, YEAR

Ví dụ: giả sử bạn muốn tính doanh thu quý 1 của năm 2020, từ ngày 1/1/2020, và kéo dài 3 tháng

Doanh thu quý I/2020 = CALCULATE(SUM(fact_sales[sales_amount]), DATESINPERIOD(dim_date[date], DATE(2020,1,1), 3, MONTH))

Hàm này trả về doanh thu của quý 1 năm 2020.

DATESBETWEEN

DATESBETWEEN là một hàm DAX dùng để trả về tập hợp ngày nằm trong khoảng thời gian cụ thể được xác định bởi hai tham số: ngày bắt đầu và ngày kết thúc.

Cú pháp:

DATESBETWEEN(<Dates>, <StartDate>, <EndDate>)

Trong đó:

Chỉ số Định nghĩa
Dates Là một cột chứa dữ liệu ngày
StartDate Ngày bắt đầu của khoảng thời gian
EndDate Ngày kết thúc của khoảng thời gian

Ví dụ: giả sử bạn muốn tính doanh thu quý 1 của năm 2020, từ ngày bắt đầu là 1/1/2020, và kết thúc vào ngày 31/3/2020.

Doanh thu quý I/2020 = CALCULATE(SUM(fact_sales[sales_amount]), DATESBETWEEN(dim_date[date], DATE(2020,1,1), DATE(2020,3,31)))

Hàm này trả về doanh thu của quý 1 năm 2020.

Trưởng hợp sử dụng:

  • DATESINPERIOD thích hợp dùng khi bạn cần một khoảng thời gian động từ một ngày bắt đầu cụ thể do bạn chỉ định, ví dụ: Doanh thu trong 3 tháng từ một ngày mà bạn muốn.
  • DATESBETWEEN thích hợp khi bạn biết rõ khoảng thời gian cố định với ngày bắt đầu và kết thúc, ví dụ: doanh thu từ 01/01/2020 đến 31/3/2020.

3. PARALLELPERIOD VÀ PREVIOUSMONTH

PREVIOUSMONTH

PREVIOUSMONTH là hàm DAX dùng để trả về một tập hợp ngày thuộc tháng trước đó của khoảng thời gian hiện tại.

Cú pháp:

PREVIOUSMONTH(<Dates>)

Trong đó: dates là cột chứa dữ liệu thời gian

Ví dụ: bạn muốn tính doanh thu của tháng trước so với tháng hiện tại

Doanh Thu Tháng Trước = CALCULATE(SUM(fact_sales[sales_amount]), PREVIOUSMONTH(dim_date[date]))

Hàm này trả về doanh thu của tháng trước so với tháng hiện tại.

PARALLELPERIOD

PARALLELPERIOD là hàm DAX dùng để trả về một tập hợp ngày từ cùng kỳ của khoảng thời gian trước đó (có thể là tháng, quý, năm), tính từ một mốc thời gian hiện tại.

Cú pháp:

PARALLELPERIOD(<dates>,<number_of_intervals>,<interval>)

Trong đó:

Chỉ số ĐỊnh nghĩa
dates Là một cột chứa dữ liệu ngày
number_of_intervals Số khoảng thời gian, có thể âm hoặc dương
interval Đơn vị thời gian: MONTH, QUARTER, YEAR

+ Lùi một tháng:

Ví dụ: bạn muốn tính doanh thu của tháng trước so với tháng hiện tại

Doanh Thu Tháng Trước = CALCULATE(SUM(fact_sales[sales_amount]), PARALLELPERIOD(dim_date[date], -1, MONTH))

Hàm này trả về doanh thu của tháng trước so với tháng hiện tại

+ Lùi 2 tháng:

Ví dụ: bạn muốn tính doanh thu của 2 tháng trước so với tháng hiện tại

Doanh Thu 2 Tháng Trước = CALCULATE(SUM(fact_sales[sales_amount]), PARALLELPERIOD(dim_date[date], -2, MONTH))

Hàm này trả về doanh thu của 2 tháng trước so với tháng hiện tại

Trường hợp sử dụng

  • PARALLELPERIOD: Dùng khi bạn muốn tính doanh thu theo tháng, và có thể mở rộng ra 2 tháng, 5 tháng trước,… chứ không cố định chỉ tháng trước như hàm PREVIOUSMONTH.
  • PREVIOUSMONTH: Dùng khi bạn chỉ cần tính doanh thu của tháng trước theo ngày hiện tại