다음을 통해 공유


Power BI에서 시간 기반 계산 구현

Power BI는 자동 날짜 테이블 또는 추가하는 날짜 테이블을 사용하는 시간 기반 계산을 수행하는 여러 도구를 제공합니다.

일정 기반 시간 인텔리전스(미리 보기)는 일정에 맞게 최상의 성능과 가장 높은 범위의 유연성을 제공하기 때문에 사용하는 것이 좋습니다.

이 표에서는 제공된 세 가지 도구를 비교합니다.

Tool 설치 작업 필요 관리 용이성 유연성 비고
자동 날짜/시간 사실상 0 힘들다 낮다 숨겨진 날짜 테이블이 여러 개 생성되면 모델 크기가 증가합니다.
클래식 시간 인텔리전스 medium 간단한 낮다 날짜 테이블 생성이 필요하며, 그레고리오력 또는 이동된 그레고리오력으로 가정하며, 일부 특정 시나리오에서 성능 문제가 있을 수 있습니다.
일정 기반 시간 인텔리전스 높다 medium 높다 날짜 테이블을 만드는 것이 좋습니다. 이는 가장 높은 유연성과 최상의 성능을 제공하지만, 설치 비용이 증가할 수 있습니다.

비고

대체 시간 인텔리전스 기술, 특히 특정 사용 사례를 제외하고 오프셋을 계산하기 위해 날짜 테이블에 추가 열을 추가하는 방법을 사용하지 않는 것이 좋습니다. 이러한 접근 방식은 간단한 DAX 수식으로 인해 초보자에게 어필할 수 있지만 의미 체계 모델을 불필요하게 팽창하는 경향이 있습니다. 이러한 팽창 현상은 데이터 세트가 증가함에 따라 데이터 새로 고침 속도가 느려지고 보고서 성능이 저하될 수 있습니다.

자동 날짜/시간

자동 날짜/시간 기능은 데이터 모델의 각 날짜 필드에 대해 숨겨진 날짜 테이블을 자동으로 만듭니다. 이 자동 동작에 대한 자세한 내용은 Power BI Desktop에서 자동 날짜/시간 적용을 참조하세요.

비고

자동 날짜/시간은 간단한 모델에 편리한 옵션이지만 더 복잡한 시나리오와 더 큰 모델에는 권장되지 않습니다. 이러한 모델의 경우 더 많은 유연성을 위해 전용 테이블을 만드는 것이 좋습니다.

날짜 테이블 추가

대부분의 모델의 경우 날짜 테이블(또는 일부 시나리오에서 이상)을 추가하는 것이 좋습니다. 많은 데이터 분석가는 자체 날짜 테이블을 만드는 것을 선호합니다.

이러한 테이블을 만드는 방법에는 다음과 같은 여러 가지가 있습니다.

가장 적합한 옵션은 다양한 요인에 따라 달라지며 이 자습서의 범위를 벗어납니다.

시간 기반 계산 작업

자동 날짜/시간을 사용하지 않는다고 가정하면 Power BI에서 시간 인텔리전스 함수를 사용하여 시간 기반 계산을 수행하는 두 가지 다른 방법이 있습니다.

  • 클래식 타임 인텔리전스. 가장 쉬운 옵션이며 그레고리오력 또는 이동된 그레고리오력에 적합하지만 다르게 구조화된 달력이나 주 기반 계산에 대한 유연성은 제한적입니다.
  • 일정 기반 시간 인텔리전스(미리 보기). 최신 옵션이지만 설정하려면 좀 더 많은 작업이 필요합니다. 그러나 더 나은 성능, 양력 이외의 달력으로 작업할 수 있는 유연성 및 주 기반 계산을 수행할 수 있는 기능도 제공합니다.

비고

특정 시나리오에 대한 날짜 테이블로 테이블을 설정 해야 합니다.

클래식 시간 인텔리전스

이 옵션을 사용하려면 모델에 날짜 테이블이 있어야 하고 그에 따라 설정해야 합니다. 그 후 시간 인텔리전스 함수를 사용하고 날짜 테이블을 참조할 수 있습니다. 예를 들어, 모델에 Date이라는 날짜 테이블이 있고, 해당 테이블을 날짜 테이블로 설정하며, 이 테이블에 'Date' 열이 포함되어 있는 경우, 다음을 사용할 수 있습니다.

SAMEPERIODLASTYEAR ( 'Date'[Date] )

이는 빠르고 쉬운 방법이지만 달력 기반 접근 방식에 비해 많은 단점이 있습니다.

  • 날짜 테이블을 설정해야 합니다.
  • 하나 이상의 전용 날짜 테이블이 있는 모델에서만 작동합니다.
  • 사용된 날짜 열에는 첫 번째 날짜와 마지막 날짜 사이에 누락된 날짜가 없어야 합니다. 첫 번째 날짜와 마지막 날짜 사이에 누락된 날짜가 있으면 오류가 throw됩니다.
  • 그레고리오력 또는 변형된 그레고리오력(예: 7월 1일에 시작하지만 여전히 그레고리오력을 따르는 회계 연도)에 최적화되어 있기 때문에 유연성이 떨어집니다.
  • 주 기반 계산을 제공하지 않습니다.
  • 특정 시나리오에서는 시간 기반 계산이 잘 수행되지 않습니다.

비고

향상된 일정 기반 접근 방식을 사용하는 것이 좋습니다.

일정 기반 시간 인텔리전스(미리 보기)

달력은 테이블에 추가된 메타데이터 정의로, 해당 테이블의 어떤 열이 시간의 특성을 나타내는지 나타냅니다. 모델의 모든 테이블에서 하나 이상의 일정을 정의할 수 있습니다. 모델에서 달력을 정의한 후에는 시간 인텔리전스 함수에서 달력을 참조할 수 있습니다. 예를 들어 정의된 회계 달력을 사용하여 연간 총 판매액을 계산하는 방법은 다음과 같습니다.

TOTALYTD ( [Sales], 'Fiscal Calendar' )

일정 기반 시간 인텔리전스의 이점

일정 기반 시간 인텔리전스의 주요 이점은 다음과 같습니다.

모든 일정에서 작동

달력을 사용하면 연도, 분기, 월 및 주 단위로 시간을 나누는 방법을 유연하게 결정할 수 있습니다. 예를 들어 다음 패턴을 따르는 달력을 정의할 수 있습니다.

  • Gregorian
  • 시프트된 그레고리오 달력
  • 소매(445, 454, 544 패턴)
  • 13개월
  • 음력

일정이 어떻게 구성되는지에 대한 Power BI의 기본 제공 가정이 없기 때문에 가능성은 무궁무진합니다. 일정 기반 시간 인텔리전스는 기본 날짜에 대해 가정하지 않습니다. 모든 계산은 있는 그대로의 기본 데이터를 사용합니다.

드문드문 날짜

클래식 시간 인텔리전스 를 사용하려면 제공된 날짜 열이 완료되어야 합니다. 첫 번째 날짜와 마지막 날짜 사이에 누락된 날짜가 있으면 오류가 throw됩니다. 일정 기반 시간 인텔리전스 함수에는 이러한 요구 사항이 없습니다. 대신 날짜를 그대로 처리합니다. 완전하고 전용 달력 테이블을 사용하는 것이 좋지만 더 이상 필요하지 않습니다. 예를 들어 모든 소매점이 주말에 문을 닫는 경우 판매가 없으므로 주말 동안 건너뛸 수 있습니다. 이제 주말이 토요일과 일요일이라고 가정할 때, 주말에 대한 항목이 없는 테이블을 기반으로 달력을 사용하여 PREVIOUSDAY 월요일부터 금요일까지 바로 이동할 수 있습니다.

주 기반 계산

일정 기반 시간 인텔리전스는 1주일 단위로 작동하는 DAX 함수를 직접 제공합니다. 예를 들어 다음을 사용하여 TOTALWTD주별 합계를 직접 계산할 수 있습니다.

TOTALWTD ( Expr, CalendarName )

성능 향상

일부 시나리오에서는 달력 기반 시간 인텔리전스 함수를 클래식 함수와 비교할 때 성능이 향상될 수 있습니다. 예를 들어 주별로 그룹화되고 연도별 계산을 수행하는 TOTALYTD ( ..., CalendarName ) 시각적 개체는 일반적으로 클래식 항목 TOTALYTD ( ..., TableName[DateColumnName] )이 사용된 경우보다 더 빠르게 실행되어야 합니다. 이런 일이 발생하는 이유에 대한 자세한 내용은 컨텍스트 지우기 섹션을 참조하세요.

향상된 DAX 시간 인텔리전스 미리 보기 사용

시작하려면 먼저 향상된 DAX 시간 인텔리전스 미리 보기 기능을 사용하도록 설정해야 합니다.

  1. Power BI Desktop에서 파일 > 옵션 및 설정 > 옵션 > 미리 보기 기능으로 이동합니다.
  2. 향상된 DAX 시간 인텔리전스 미리 보기를 선택합니다.
  3. 확인을 선택합니다.
  4. Power BI Desktop 다시 시작

일정 관리

일정을 관리하려면 일정을 정의할 달력이 포함된 테이블을 마우스 오른쪽 단추로 클릭하고 테이블을 선택한 후 [테이블 도구] 리본 메뉴에서 일정 옵션을 선택하거나 [일정] 옵션을 선택합니다.

테이블에서 일정 옵션을 여는 진입점을 보여 주는 스크린샷.

또는 외부 도구 또는 TMDL 보기를 사용하여 일정을 정의할 수 있습니다. 자세한 내용은 TMDL 스크립트를 참조하세요.

달력은 정의된 테이블 아래에 있는 모델 탐색기에도 표시됩니다.

의미 체계 모델의 모델 탐색기를 보여 주는 스크린샷 날짜 테이블 노드가 확장되고 일정이 강조 표시됩니다.

일정 옵션 화면

일정 옵션 화면에는 선택한 테이블에 정의된 일정이 표시됩니다. 다음을 수행할 수 있습니다.

  • 새 일정을 선택하여 새 일정 만들기
  • 편집을 선택하여 기존 일정 편집
  • 삭제를 선택하여 기존 일정 삭제
  • 날짜 테이블로 설정하기 위해 '날짜 테이블로 표시'를 선택하세요.

테이블의 일정 옵션을 보여 주는 스크린샷

열 범주 할당

달력을 정의하려면 이름을 지정하고 범주에 열을 할당해야 합니다. 각 범주는 시간 단위를 나타내며 특정 열 범주 를 사용할 수 있습니다. 일정을 저장하려면 하나 이상의 기본 열을 범주에 할당해야 합니다. 각 범주에는 기본 열이 있어야 하며 0개 이상의 연결된 열이 있을 수 있습니다. 범주에 연결된 열이 컨텍스트에 있을 때마다 Power BI는 해당 열이 존재하는 시간 단위를 알고 있습니다. 또한 Power BI와 같은 TOTALMTD 일부 함수의 경우 참조된 달력의 관련 범주에 매핑된 기본 열을 사용하여 요청된 계산을 수행합니다. 범주에 열을 할당하려면 범주 추가 메뉴에서 범주 를 선택한 다음 기본 및 선택적 연결된 열을 선택합니다.

일정 만들기 및 편집 화면을 보여 주는 스크린샷

사용 가능한 열 범주

다음 표에서는 사용할 수 있는 범주를 보여줍니다. 또한 표는 그레고리오력에 대한 예제 값과 카디널리도 제공합니다.

범주는 다음 두 그룹으로 나뉩니다.

  • 완료합니다. 완료 범주에 할당된 열의 데이터는 기간을 고유하게 식별하기에 충분합니다.
  • 부분적 부분 범주에 할당된 열의 데이터는 기간을 고유하게 식별하는 데 충분하지 않습니다.
카테고리 Description 유형 그레고리오력의 카디널리티 예제 그레고리오력의 열 값 예제
연도 연도 Complete Y = 연도 수 2024, 2025
Quarter 연도를 포함한 분기 Complete 4*Y 2024년 1분기, 2025년 2분기
연간 분기 연도의 분기 Partial 4 연도 1분기, YQ1, 1분기, 2분기
Month 연도를 포함한 월 Complete 12*Y ≤ value ≤ 13*Y 2023년 1월, 2024년 2월
연도의 달 해당 연도의 달 Partial 12 1월, 연도 월 11, YM11, M11, 11
해당 분기의 월 분기의 월 Partial 3 1, QM2
Week 연도를 포함한 주 Complete 52 ≤ value ≤ 53 주 50 2023, W50-2023, 2023-W50
연도의 주 올해의 주 Partial 52 주 50, W50, 50
분기의 주간 분기의 주 Partial 13 분기 주 10, QW10, 10
월 중의 주 이번 달의 주 Partial 5 월 주 2, MW2, 2
날짜 날짜 Complete 365*Y ≤ value ≤ 366*Y 12/31/2025
일년의 하루 1년 중의 날 Partial 365 ≤ value ≤366 365, D1
분기의 날 분기의 특정일 Partial 92 분기일 10, QD2, 50
월의 날 월 중 하루 Partial 31 월 30, MD10, 30
요일 요일 Partial 7 주중 5일, WD5, 5일

이러한 범주 외에도 테이블의 열 수를 시간 관련 범주와 연결할 수 있습니다. 현재 일정 옵션에서는 사용할 수 없지만 외부 도구 또는 TMDL을 사용하여 수행할 수 있습니다.

비고

시간 관련 범주에 할당된 모든 열의 컨텍스트는 DATEADD 및 SAMEPERIODLASTYEAR 함수를 제외한 모든 함수에서 계산을 수행할 때 제거됩니다. 일정이 정의되어 있지만 해당 일정에 태그가 지정되지 않은 테이블의 일부인 열의 컨텍스트는 유지됩니다.

비고

시간 인텔리전스 계산에 사용하려는 일정의 열만 연결하는 것이 좋습니다.

기본 열과 연결된 열 비교

기본 열은 각 범주에 필요합니다. 참조된 달력에서 동일한 범주에 할당된 열 또는 연결된 열이 컨텍스트에 있거나 계산을 수행하는 데 범주가 필요할 때마다 Power BI는 기본 열을 사용합니다. 또한 기본 열은 정렬에 사용됩니다. 기본 열의 값이 예상대로 정렬할 수 없으면 다른 열을 기준으로 정렬하도록 기본 열을 구성하거나 다른 열을 사용하여 원래 열을 연결된 열로 만들 수 있습니다. 예를 들어 월 번호와 연도를 mm-yyyy 포함하는 텍스트 데이터가 있는 열(즉, 01-202402-2024등)은 여러 연도에 걸쳐 올바르게 정렬되지 않지만 형식을 사용하는 yyyy-mm 열은 다음과 같습니다.

두 테이블을 보여 주는 스크린샷. 각 테이블에는 하나의 열이 있습니다. 첫 번째 테이블에는 텍스트 월 번호와 연도 정보가 mm-yyyy 형식으로 포함된 열이 있고 두 번째 테이블에는 동일한 정보가 yyyy-mm 형식으로 포함되어 있습니다. mm-yyyy 형식 데이터를 포함하는 열이 올바르게 정렬되지 않았습니다.

범주에 0개 이상의 연결된 열을 할당할 수 있습니다.

Validation

일정이 요구 사항에 맞는지 확신할 수 있도록 일정의 유효성을 검사하고 테스트하는 것이 중요합니다. Power BI에서 제공되는 유효성 검사에는 실시간 유효성 검사오프라인 유효성 검사가 모두 포함됩니다.

비고

오프라인 유효성 검사 오류에도 불구하고 일정을 저장할 수 있지만 먼저 해결하는 것이 좋습니다. 저장하려면 실시간 유효성 검사 실패를 수정해야 합니다.

실시간 유효성 검사

일정에서 수행되는 실시간 유효성 검사는 다음과 같습니다.

  • 고유한 일정 이름입니다. 각 달력에는 의미 체계 모델에 고유한 이름이 있어야 합니다.
  • 일정당 단일 연결입니다. 열은 동일한 달력에서 둘 이상의 범주에 속할 수 없습니다.
  • 기간 고유성. 할당된 범주는 기간을 고유하게 식별해야 합니다.
  • 일관된 분류입니다. 이렇게 하면 열이 일정에서 동일한 범주와 연결됩니다.

기간 고유성

할당된 범주의 기간을 고유하게 식별하는 경로는 항상 있어야 합니다.

부분 범주를 추가할 때마다 Power BI는 전체 또는 부분 범주의 일치 조합도 동일한 일정에 태그가 지정되었는지 확인합니다. 그렇지 않은 경우 경고가 표시됩니다.

실시간 유효성 검사 오류가 있는 일정 만들기 및 편집 화면을 보여 주는 스크린샷

예를 들어 주 기반 계산을 위해 달력을 설정할 때 다음 범주 집합 중 하나에 최소한 기본 열을 할당해야 합니다.

  • Week
  • 연 중 주, 연도
  • 주/분기, 분기
  • 분기의 주, 연 분기, 연도
  • 매월의 주, 이 달
  • 해당 월의 몇 번째 주, 연도의 월, 연도
  • 월의 주, 분기의 달, 분기
  • 한 달의 주, 분기의 월, 연도의 분기, 연도

일관된 분류

열에는 일정 간에 일관된 범주가 있어야 합니다. 연도 ,연도 분기 또는 시간 관련 일정과 같은 다른 범주에는 동일한 열을 할당할 수 없습니다.

오프라인 유효성 검사

오프라인 유효성 검사는 테이블 데이터에 액세스할 때 시간이 오래 걸릴 수 있습니다. 따라서 실시간 유효성 검사와 달리 자동으로 실행되지 않습니다. 유효성 검사를 실행하려면 데이터 유효성 검사를 선택합니다.

일정 만들기 및 편집 화면을 보여 주는 스크린샷 데이터 유효성 검사 단추가 강조 표시됩니다.

오프라인 유효성 검사는 다음 규칙을 확인하고 일정에서 규칙이 무효화되면 경고를 반환합니다.

  • 범주와 연결된 열에는 빈 값이 없습니다.
  • 상위 수준 및 하위 수준 범주에는 일대다 카디널리티 비율이 있습니다. 예를 들어 Year 범주와 연결된 열은 월 범주와 연결된 열과 일대다 관계를 가져야 합니다.
  • 같은 수준의 범주와 연결된 열에는 일 대 일 카디널리티 비율이 있습니다. 예를 들어 월 범주와 연결된 열에는 연도 및 연도 범주와 연결된 열의 조합과 일대일 카디널리티가 있어야 합니다.
  • 동일한 범주에 할당된 기본 및 연결된 열에는 일 대 일 카디널리티 비율이 있습니다. 예를 들어 Month 범주에 할당된 경우 주 열 Month 및 연결된 열 EnglishMonthName에는 일대일 카디널리티가 있어야 합니다.

달력 작업

일정이 정의되면 시간 인텔리전스 함수에서 이를 참조할 수 있습니다. 예를 들어 다음 측정값은 ISO-454 달력에 대한 총 월-날짜 합계 수량을 계산합니다.

Total Quantity MTD ISO-454 = TOTALMTD ( [Total Quantity], 'ISO-454' )

일정이 정의되지 않고 오류가 반환되는 경우:

존재하지 않는 달력에 TOTALMTD 대한 달력 매개 변수와 함께 함수를 사용하는 측정값을 보여 주는 스크린샷.

그러나 달력이 정의되어 있더라도 측정값은 여전히 오류를 반환할 수 있습니다. 이 문제는 사용된 함수가 일정에 범주가 있어야 하고 일정에 해당 범주가 없는 경우에 발생합니다. 예를 들어 TOTALWTD 일정에 특정 범주가 있어야 합니다. 그렇지 않으면 오류가 반환됩니다.

필요한 범주를 정의하지 않는 유효한 달력 참조와 함께 함수를 사용하는 TOTALWTD 측정값을 보여 주는 스크린샷.

시간 인텔리전스 함수 및 필수 범주

많은 시간 인텔리전스 함수는 Power BI가 고유한 특정 시간 단위를 식별할 수 있도록 함수 호출에서 참조되는 일정에 충분한 범주를 포함해야 합니다. 즉, Power BI는 계산이 수행되는 수준에서 개별 연도까지 "워크업"할 수 있어야 합니다. 예를 들어 분기에 대한 계산을 수행할 때 TOTALQTD분기 범주를 할당하거나, 기간 고유성 유효성 검사에 따라 달력에서 연도의 분기연도를 모두 할당합니다.

비고

일부 함수의 경우 해당 이름은 계산이 작동하는 수준(예: )을 나타내는 반면, TOTALYTD다른 함수의 경우 매개 변수 및 컨텍스트(예: DATEADD)에 따라 달라집니다.

컨텍스트 지우기

시간 인텔리전스 함수는 특정 시점에서 시작한 다음 다른 시점을 생성하기 위해 해당 함수에 대해 일부 작업을 수행하여 작동합니다. 당연히, 초기 시점은 이 결과와 충돌하여 기본 설정에 따라 부분적이거나 빈 결과를 생성할 수 있는 필터 컨텍스트의 교집합을 유발할 수 있습니다. 예를 들어 다음 시나리오를 고려해 보세요.

일정 정의

세 가지 범주에 태그를 지정하는 간단한 그레고리오력은 다음과 같이 정의됩니다.

카테고리 기본 열
연도 연도
연도의 달 MonthOfYear
Quarter Quarter

측정값 정의

두 가지 기본 측정값이 정의됩니다. 하나는 총 매출을 계산하고 다른 하나는 이전 분기의 총 매출을 계산하는 것입니다.

[TotalSales] = CALCULATE ( SUM( FactInternetSales[SalesAmount] ) )
[LastQuarterSales] = CALCULATE ( [TotalSales], DATEADD( GregorianCalendar, -1, QUARTER ) )

예: 컨텍스트 지우기 작동 방식

테이블 시각적 개체는 YearMonthOfYear 열을 사용하여 한 달 단위로 찾아봅니다.

연도 MonthOfYear 총매출 지난분기매출
2011 1 10
2011 2 20
2011 3 30
2011 4 40 10
2011 5 50 20

이 표에서 굵게 표시된 행은 2011년 4월의 월 단위로 조회됩니다. 따라서 이 행의 모든 측정값은 [Year] == 2011 및 [MonthOfYear] == 4의 필터 컨텍스트에서 평가됩니다.
예상대로 TotalSales 는 2011년 4월의 총 판매액으로 계산됩니다.

LastQuarterSales 도 마찬가지로 TotalSales를 계산하지만 달력 기반 함수에서 제공하는 추가 필터가 DATEADD 제공됩니다. 이 행 DATEADD 의 경우 2011년 4월의 초기 시작 지점을 갖게 되며, 정확히 1분기 전인 2011년 1월의 시점을 산출합니다. 따라서 다음 두 필터 컨텍스트에서 이 TotalSales 가 계산될 것으로 예상할 수 있습니다.

  • 현재 행의 탐색 열에서 제공: { [Year] == 2011, [MonthOfYear] == 4 } (동일하게, 2011년 4월)
  • 필터 DATEADD 에 의해 제공됨: { [Year] == 2011, [MonthOfYear] == 1 } (2011년 1월)

분명히 이러한 두 필터 컨텍스트가 충돌합니다. 현재 월을 2011년 1월 2011년 4월 모두로 감안할 때 총 판매량을 평가할 수 없습니다. 이러한 교차점은 아무런 결과도 생성하지 않습니다. 그러나 이것은 발생하지 않습니다. 대신 달력 정의에 따라 일정 기반 시간 인텔리전스 함수는 함수가 수행하는 시간 작업에 따라 충돌이 발생할 수 있는 범주의 열을 식별합니다. 이 경우 DATEADD분기 수준에서 전환을 수행합니다. 이 함수는 분기 범주의 열이 변경된 결과로 연도연도의 월 범주가 모두 변경될 수 있음을 식별합니다. 따라서 함수는 해당 범주에 태그가 지정된 모든 (기본 및 연결된) 열에서 필터 컨텍스트를 지웁니다.

즉, 연도 및 월 범주는 분기 범주 종속성이라고 할 수 있습니다. 반대로 분기 범주는연도 범주에 종속되어 있다고 말할 수 있습니다.

컨텍스트 지우기 작동 방식

모든 달력 범주의 격자 구조 다이어그램

이 다이어그램은 서로 다른 시간 범주 간의 종속성을 더 잘 시각화하기 위해 제공됩니다. 이 격자의 각 범주는 해당 범주에 태그가 지정된 모든 열(기본 및 관련)을 나타냅니다. 범주는 화살표를 통해 종속성에 연결됩니다. 예를 들어, "Month"(월)은 "Year"(년), "Quarter of Year"(연간 분기), "Month Of Quarter"(분기의 월), "Quarter"(분기) 및 "Month of Year"(연간의 월)에 따라 결정됩니다.

컬럼이나 캘린더에 태그된 연관 정렬 기준 열에 컨텍스트가 설정된 경우, 이전 필터 컨텍스트는 다음에서 제거됩니다.

  1. X의 모든 범주 종속성 입니다. X 위의 모든 범주로 간주할 수 있습니다.
  2. X 및 그 종속성의 모든 범주 종속 요소(즉, 위의 1에서). X 아래의 모든 범주와 위의 1에 있는 모든 범주로 간주할 수 있습니다.

비고

컨텍스트 지우기는 시간 인텔리전스 함수를 사용하여 컨텍스트가 설정되었는지에 관계없이 달력에 태그가 지정된 열이나 관련 정렬 기준 열에서 발생합니다.

시간 인텔리전스 함수를 제외한 DATEADDSAMEPERIODLASTYEAR대부분의 시간 인텔리전스 함수는 모든 시간 관련 열 및 관련 정렬 기준 열에 대한 컨텍스트를 지웁니다.

달력 간의 동작 방식

동일한 테이블에 여러 일정이 정의되어 있는 경우 테이블에 정의된 모든 일정에 대해 이러한 프로세스가 완료됩니다. 여기에는 시간 관련 열의 컨텍스트 지우기 관련 설명이 포함됩니다. 즉, 테이블이 Calendar1, Calendar2 및 Calendar3의 세 가지 달력을 정의하고 있다고 가정합니다. Calendar1의 "X" 범주에서 필터 컨텍스트를 설정하는 경우 위의 프로세스는 세 가지 달력에서 모두 수행됩니다.

예: "Quarter"에 설정된 필터

필터 컨텍스트가 "Quarter" 범주에 설정된 경우 프로세스는 다음과 같습니다.

  1. 첫째, "분기" 범주의 모든 종속성이 고려됩니다.

    범주 분기: 종속성에서 시작하는 필터 컨텍스트 지우기 동작 예제입니다.

  2. 다음으로, "Quarter"의 모든 부차적 항목과 그 의존 관계가 고려됩니다.

    범주 분기: 종속성에서 시작하는 필터 컨텍스트 지우기 동작 예제입니다.

  3. 마지막으로 최종 결과는 다음과 입니다. 모든 빨간색 범주는 이전 필터 컨텍스트를 제거하고 새 컨텍스트는 쿼터에 설정됩니다.

    범주 분기부터 시작하는 필터 컨텍스트 지우기 동작 예제: 결과

일정에 대한 TMDL 스크립트

createOrReplace

	table Date
		lineageTag: xyz

		column Date
			dataType: dateTime
			formatString: Long Date
			lineageTag: abc
			summarizeBy: none
			sourceColumn: Date

        column Year
			dataType: string
			lineageTag: abc
			summarizeBy: none
			sourceColumn: Year

			annotation SummarizationSetBy = Automatic
        
        column Month
			dataType: string
			lineageTag: def
			summarizeBy: none
			sourceColumn: Month

			annotation SummarizationSetBy = Automatic

        column MonthName
			dataType: string
			lineageTag: ghi
			summarizeBy: none
			sourceColumn: MonthName
			sortByColumn: SortByMonth

			changedProperty = SortByColumn

			annotation SummarizationSetBy = Automatic

        column DutchMonthName
			dataType: string
			lineageTag: jkl
			summarizeBy: none
			sourceColumn: DutchMonthName

			annotation SummarizationSetBy = Automatic

        column 'Holiday Name'
			dataType: string
			lineageTag: mno
			summarizeBy: none
			sourceColumn: Holiday Name

			annotation SummarizationSetBy = Automatic
        
        column IsWorkingDay
			dataType: string
			lineageTag: pqr
			summarizeBy: none
			sourceColumn: IsWorkingDay

			annotation SummarizationSetBy = Automatic
		...	
		
		calendar 'Demo Calendar'
			lineageTag: def

			calendarColumnGroup = year
				primaryColumn: Year

			calendarColumnGroup = month
				primaryColumn: Month
				associatedColumn: DutchMonthName
				associatedColumn: MonthName
			
			calendarColumnGroup
                column: 'Holiday Name'
                column: isWorkingDay

비고

TMDL에서 범주를 calendarColumnGroup 지정하지 않으면 열에 시간 관련 태그가 지정됩니다. 이 예제에서 휴일 이름isWorkingDay데모 달력의 시간 관련 열입니다.

모두 합하기: 시간 이동의 예

일부 시간 인텔리전스 함수는 모든 열을 고려하여 컨텍스트를 횡적으로만 이동하고, 다른 함수는 열이 일정에 태그가 지정되었는지 여부에 따라 컨텍스트를 유지하거나 지우는 계층적 시프트를 수행합니다. 시간 인텔리전스 함수는 계층적 전환을 허용하는지 여부에 따라 두 그룹으로 나눌 수 있습니다.

  • 수정되었습니다. 이 그룹의 함수는 다음과 같습니다 DATEADDSAMEPERIODLASTYEAR. 이러한 함수는 횡적 시간 이동만 허용하며 다른 수준의 세부 정보에서 값을 반환하지 않습니다.
  • 유연합니다. 이 그룹에는 다른 모든 시간 인텔리전스 함수가 포함됩니다. 이러한 함수는 계층적 시간 이동을 허용하며 일정 설정에 따라 다른 수준의 세부 정보에서 결과를 반환할 수 있습니다.

이러한 동작을 보여 주려면 두 개의 테이블, 2개의 달력 및 5개의 측정값으로 구성된 간단한 데이터 모델을 사용하는 예제를 살펴보겠습니다.

테이블 및 관계

이 예제에서는 다음과 같은 간단한 데이터 모델이 있습니다.

Table 칼럼
날짜 연도, 근무일여부, 날짜
영업 주문키, 수량, 주문일자

다음은 Date 테이블의 몇 가지 예제 행입니다. 예제 Date 테이블의 처음 14개 행을 보여 주는 스크린샷 테이블은 Date, Year 및 IsWorkingDay를 정의합니다. 날짜 열에는 날짜, 연도 값의 Year 열이 포함되며 IsWorkingDay 열은 날짜가 작업일인지 여부를 나타내는 부울(True/False) 열입니다.

다음은 Sales 테이블의 몇 가지 예제 행입니다. 예제 Sales 테이블의 처음 9개 행을 보여 주는 스크린샷 이 테이블은 OrderKey, OrderDate 및 Order Quantity를 정의합니다. OrderKey 열에는 각 판매 주문에 대한 고유 번호가 포함되며 OrderDate는 Sales와 Date를 연관시키는 날짜이고 주문 수량은 각 주문의 제품 수를 나타내는 숫자 열입니다.

Sales 테이블과 Date 테이블은 OrderDate와 Date 필드를 통해 관련되어 있습니다.

예제 모델의 모델을 보여 주는 스크린샷으로, Sales 및 Date 테이블과 OrderDate와 Date 간의 일대다 관계를 보여줍니다.

Calendars

Date 테이블에서 다음 매핑을 사용하여 일정을 정의했습니다.

캘린더 이름 카테고리 기본 열
양력 연도 연도
날짜 날짜
GregorianWithWorkingDay 연도 연도
날짜 날짜
시간 관련 IsWorkingDay

이러한 두 달력에 해당하는 TMDL 정의는 다음과 같습니다.

ref table Date
    calendar 'Gregorian'
        lineageTag: xyz
    
        calendarColumnGroup = year
    	    primaryColumn: Year
    
    	calendarColumnGroup = date
    		primaryColumn: Date
    
    calendar 'GregorianWithWorkingDay'
    	lineageTag: dc4fc383-1661-4112-8afb-930d324fbb6e
    
    	calendarColumnGroup = year
    		primaryColumn: Year
    
    	calendarColumnGroup = date
    		primaryColumn: Date
    
    	calendarColumnGroup
    		column: IsWorkingDay   

측정

Sales 테이블에서 다음 측정값을 정의합니다.

Total Quantity = SUM ( 'Sales'[Order Quantity] )

OneYearAgoQuantity =
CALCULATE ( [Total Quantity], DATEADD ( 'Gregorian', -1, YEAR ) )

OneYearAgoQuantityTimeRelated =
CALCULATE ( [Total Quantity], DATEADD ( 'GregorianWithWorkingDay', -1, YEAR ) )

FullLastYearQuantity =
CALCULATE ( [Total Quantity], PARALLELPERIOD ( 'Gregorian', -1, YEAR ) )

FullLastYearQuantityTimeRelated =
CALCULATE ( [Total Quantity], PARALLELPERIOD ( 'GregorianWithWorkingDay', -1, YEAR )
)

횡적 시프트 예제

2024년과 2025년의 연도, 연월, 근무일 여부, 총 수량, 1년 전 수량 및 1년 전 수량 관련을 보여주는 시각화 자료를 만들어 보겠습니다.

Year, IsWorkingDay, Total Quantity, OneYearAgoQuantity 및 OneYearAgoQuantityTimeRelated를 보여 주는 테이블 시각적 개체를 보여 주는 스크린샷 2025년 OneYearAgoQuantity 및 OneYearAgoQuantityTimeRelated의 값은 동일한 IsWorkingDay 값에 대한 2024의 값과 일치합니다.

2025년 OneYearAgoQuantityOneYearAgoQuantityTimeRelated의 모든 값은 동일한 IsWorkingDay 값에 대해 정확히 1년 전(2024년)의 총 수량과 일치합니다.

태그가 DATEADD 지정되지 않았거나 해당 일정에 시간 관련 태그가 지정되었는지 여부에 관계없이 사용된 달력이 포함된 날짜 테이블의 모든 열에서 컨텍스트를 유지 관리하는 것을 보여 줍니다. 측정값 정의에서 DATEADD 뒤로 이동하도록 지시했 으므로 컨텍스트가 이동된 유일한 열은 Year 범주와 연결된 열뿐입니다. IsWorkingDay 열이 일정에서 시간 관련 태그로 지정되었는지 또는 태그가 전혀 지정되지 않았는지 여부는 결과를 변경하지 않았습니다. 이 동작을 나타내는 유일한 다른 함수는 .입니다 SAMEPERIODLASTYEAR.

계층적 시프트 예제

이제 열에 시간 관련 태그가 지정되어 있는지 여부가 실제로 결과를 변경하지 않는 예제를 살펴보겠습니다.

이를 위해 이전 예제와 동일한 시각적 개체를 다시 만들겠지만 이번에는 FullLastYearQuantity 및 FullLastYearQuantityTimeRelated 측정값을 사용합니다. Year, IsWorkingDay, Total Quantity, FullLastYearQuantity 및 FullLastYearQuantityTimeRelated를 보여 주는 테이블 시각적 개체를 보여 주는 스크린샷 FullLastYearQuantity 2025의 값은 동일한 IsWorkingDay 값의 2024 값과 일치하지만 FullLastYearQuantityTimeRelated의 값은 IsWorkingDay 값에 관계없이 총 수량 값과 같습니다.

이는 일정에 태그가 PARALLELPERIOD 지정되지 않은 열의 컨텍스트를 유지하지만 시간 관련 태그로 태그가 지정된 열의 컨텍스트를 지우는 것을 보여 줍니다. FullLastYearQuantity는 IsWorkingDay가 달력에 태그되지 않은 그레고리오력을 사용한 반면, FullLastYearQuantityTimeRelated는 IsWorkingDay에 시간 관련 태그가 지정된 GregorianWithWorkingDay 달력을 사용했습니다. DATEADD 및 SAMEPERIODLASTYEAR를 제외한 모든 시간 인텔리전스 함수가 이 방식으로 동작합니다.

보너스: 이러한 함수가 시간 관련 열에 대한 컨텍스트를 유지하도록 강제하려는 경우 다음을 사용할 VALUES수 있습니다.

FullLastYearQuantityTimeRelatedOverride =
CALCULATE ( [Total Quantity], PARALLELPERIOD ( 'GregorianWithWorkingDay', -1, YEAR ), VALUES('Date'[IsWorkingDay]) )

이 경우 FullLastYearQuantityTimeRelatedOverride .와 동일한 결과를 FullLastYearQuantity반환합니다.

결론

위의 정교한 예제는 열에 일정에서 시간 관련 태그가 지정되는지 여부에 따라 다른 시간 인텔리전스 함수가 다르게 동작한다는 것을 보여 줍니다. DATEADDSAMEPERIODLASTYEAR는 측면 시간 이동만 수행합니다. 다른 모든 시간 인텔리전스 함수는 계층적 시간 이동을 허용합니다.

DATEADD를 일정과 함께 사용하세요

함수에는 DATEADD 선택 영역이 interval 매개 변수에 의해 표시된 시프트 수준보다 더 세분화된 수준에 있을 때, 시프트가 수행되는 방식을 세밀하게 제어할 수 있는 특정 매개 변수가 DATEADD 있습니다. 예를 들어, 날짜 수준에서 데이터를 표시하는 경우인데도 interval 매개 변수를 DATEADDMONTH로 설정하는 상황이 발생할 수 있습니다. 예를 들어 그레고리오력에서 3월 3일부터 10일까지의 기간을 한 달에 한 달씩 이동하면 4월 3일부터 10일까지가 됩니다. 그러나 양력의 월 길이가 다르므로 이동 시 모호성이 발생할 수 있습니다. 다음은 그레고리오력에 따른 예제 시나리오입니다.

더 짧은 기간에서 더 긴 기간으로 전환

예를 들어 2월에 선택 항목으로 한 달 앞으로 이동하면 대상 월이 3월입니다. 매개 변수를 extension 사용하여 시프트가 수행되는 방식에 영향을 줄 수 있습니다.

확장 매개 변수 값 Description 결과
precise 이렇게 하면 원래 날짜 범위가 엄격하게 유지됩니다. 2월 25-28일은 3월 25-28일로 변경됩니다.
extended 월말까지 창을 확장할 수 있습니다. 2월 25-28일은 3월 25-31일로 변경됩니다.

더 긴 기간에서 더 짧은 기간으로 전환

예를 들어 3월에 선택 항목이 있는 한 달 뒤로 이동하면 대상 월이 2월입니다.

매개 변수를 truncation 사용하여 시프트가 수행되는 방식에 영향을 줄 수 있습니다.

잘림 매개 변수 값 Description 결과
anchored 결과를 더 작은 달의 마지막 유효 날짜에 고정합니다. 3월 31일은 2월 28일(또는 윤년 29일)로 변경됩니다.
blank 이동된 날짜가 없으면 공백을 반환합니다. 3월 31일을 한 달 전으로 이동하면 공백이 반환됩니다(2월 31일은 존재하지 않기 때문에).

일정 기반 시간 인텔리전스를 사용하기 위한 고려 사항

  • 달력을 정의하고 RLS(행 수준 보안) 규칙의 적용을 받으며 예기치 않은 결과를 초래할 수 있는 팩트 테이블에서 시간 인텔리전스 계산을 수행합니다.
  • 이 미리 보기 기능의 성능은 최종 제품을 대표하지 않습니다.
  • 아직 Power BI 서비스에서 일정을 작성할 수 없습니다.
  • 사용자 지정 달력에는 자동 날짜/시간 테이블을 사용하면 안 됩니다.
  • 라이브 연결 또는 복합 모델에서는 일정을 사용할 수 없습니다.
  • 시간 인텔리전스 계산에 사용하려는 일정의 열만 연결하는 것이 좋습니다.
  • 일정은 실시간오프라인 유효성 검사의 적용을 받습니다. 오프라인 유효성 검사 오류에도 불구하고 일정을 저장할 수 있지만 먼저 해결하는 것이 좋습니다. 저장하려면 실시간 유효성 검사 실패를 수정해야 합니다.
  • 각 일정에는 데이터 모델 내에서 고유한 이름이 있어야 합니다.
  • 단일 테이블에는 여러 일정이 포함될 수 있습니다.
  • 달력이 포함된 테이블에는 200개 미만의 열이 있어야 합니다. 테이블에 20,000개 이상의 행이 포함된 경우 유효성 검사를 사용할 수 없지만 일정을 추가할 수 있습니다.
  • 일정은 범주에 하나 이상의 기본 열을 할당해야 합니다.
  • 일정은 자체 테이블의 열만 범주에 할당할 수 있습니다.
  • 각 범주에는 기본 열이 있어야 하며 0개 이상의 연결된 열이 할당될 수 있습니다.
  • 에는 IntelliSense에서 인식되지 않는 확장 및 확장 동작을 제어하는 새 매개 변수가 있습니다.DATEADD
  • 지정된 열은 하나의 범주에만 매핑할 수 있습니다.
  • 달력을 사용하는 시간 인텔리전스 함수는 중첩할 수 없습니다. 예를 들어 다음 DAX 예문은 지원되지 않습니다.
ThisIsNotSupported = PREVIOUSDAY ( PREVIOUSMONTH( 'Calendar' ) )

대신 다음을 수행할 수 있습니다.

ThisWorks = CALCULATETABLE ( PREVIOUSDAY ( 'Calendar' ), PREVIOUSMONTH( 'Calendar' ) )

기본 제공 도구를 사용하여 날짜 테이블 만들기

다음 예제에서는 파워 쿼리 M 또는 DAX를 사용하여 2010년 1월 1일부터 2030년 12월 31일까지 날짜 테이블을 만듭니다. 여기에는 연도, 월 번호, 월 이름, 월 연도, 분기, 연도 분기, 일 및 날짜 열이 포함됩니다.

파워 쿼리 M

let
    StartDate = #date(2010, 1, 1),
    EndDate = #date(2030, 12, 31),
    NumberOfDays = Duration.Days(EndDate - StartDate) + 1,
    DateList = List.Dates(StartDate, NumberOfDays, #duration(1,0,0,0)),
    DateTable = Table.FromList(DateList, Splitter.SplitByNothing(), {"Date"}),
    AddYear = Table.AddColumn(DateTable, "Year", each Date.Year([Date]), Int64.Type),
    AddMonthNumber = Table.AddColumn(AddYear, "Month Number", each Date.Month([Date]), Int64.Type),
    AddMonthName = Table.AddColumn(AddMonthNumber, "Month Name", each Date.ToText([Date], "MMMM"), type text),
    AddMonthYear = Table.AddColumn(AddMonthName, "Month Year", each Date.ToText([Date], "MMM yyyy"), type text),
    AddQuarter = Table.AddColumn(AddMonthYear, "Quarter", each "Q" & Text.From(Date.QuarterOfYear([Date])), type text),
    AddYearQuarter = Table.AddColumn(AddQuarter, "Year Quarter", each Text.From(Date.Year([Date])) & " Q" & Text.From(Date.QuarterOfYear([Date])), type text),
    AddDay = Table.AddColumn(AddYearQuarter, "Day", each Date.Day([Date]), Int64.Type)
in
    AddDay

DAX

DateTable =
ADDCOLUMNS (
    CALENDAR ( DATE ( 2010, 1, 1 ), DATE ( 2030, 12, 31 ) ),
    "Year", YEAR ( [Date] ),
    "Month Number", MONTH ( [Date] ),
    "Month Name", FORMAT ( [Date], "MMMM" ),
    "Month Year", FORMAT ( [Date], "MMM YYYY" ),
    "Quarter", "Q" & FORMAT ( [Date], "Q" ),
    "Year Quarter",
        FORMAT ( [Date], "YYYY" ) & " Q"
            & FORMAT ( [Date], "Q" ),
    "Day", DAY ( [Date] ),
    "Date", [Date]
)

자세한 내용 및 자세한 옵션은 날짜 테이블을 참조하세요.

이 문서와 관련된 자세한 내용은 다음 리소스를 참조하세요.