이번 블로그는 한글로 작성해볼까 한다. 내가 POWER BI를 한글버전으로 사용하지 않기 때문에 불필요한 영어단어가 한글문장에 많이 포함됨을 이해해 주시길...
이번 블로그에서는 나는 어떤 식으로 WINDOW DAX Function을 이해하고 있고, 사용하고 있는지 공유하고자 한다.
2022년 12월에 POWER BI의 새로운 DAX Function이 소개되었다.
OFFSET, INDEX, WINDOW 이렇게 세가지가 소개되었다. 공식적으로 소개가 된 12월 초 이전에는 OFFSET DAX function만이 비공식적으로 알려졌다. 매우 편리한 기능이기는 하다. 하지만, OFFSET이라는 단어에서도 알 수 있듯이, 현재의 값에서 전 월 값은? 3개월 전 값은? 또는 2분기 이전 값은? 등등의 질문에 대한 답을 할 때에 사용하기에 매우 편하지만, Dimension Calendar Table을 사용하는 대부분의 Data model에서는 Dimension Calendar Table에 Month OFFSET column, Quarter OFFSET column 등이 이미 있는 경우가 대부분이며, 이때에는 구지 OFFSET DAX Function이 필요하지가 않다. 하지만, 초보자 또는 심지어 중급자의 경우에도 이러한 OFFSET columns가 없는 Dimension Calendar Table을 사용하고 있고, 이 경우에는, 예를들어 202201 라는 숫자 (2022년 1월)에서 -1을 해봐야 내가 원하는 202112가 계산되지 않기 때문에, 이런 분들에게는 OFFSET DAX function이 매우 유용하게 사용된다고 내가 이미 설명을 했다 (이전 블로그 😁).
또한, performance analyzer, DAX Studio 등 에서 분석을 해보면, 대부분의 POWER BI 프로젝트에서 time intelligence DAX functions를 사용하는 것 보다 속도 또한 비교우위에 있음을 알 수 있는 다른 사람들이 쓴 블로그들이 여러개 있다.
그렇다고 한다면, 2022년 12월에 새롭게 소개된 OFFSET, INDEX, WINDOW 기능을 사용해야 할 이유는 나름 갖추었다고 생각된다. 사용하기 위해서는 공부를 조금은 해야하는데, 나의 생각으로는 WINDOW DAX function만 제대로 이해한다면 나머지 두개는 자동으로 이해될 것으로 판단된다. 이 세개를 WINDOW family라고 묶어서 부르기도 하기 때문인 것이 그 이유이기도 하다.
내가 샘플로 사용할 모델은 나름 간단하다.
이 샘플에서 3 months rolling sum과 몇가지 다른 문제를 해결하는 DAX measures를 작성하는 방법을 공부해보자.
이 중에서, 아래의 부분만을 설명해볼까 한다.
Report tab에서 Table visualization을 사용하여 아래의 DAX Measure를 작성 후 표를 만들었다.
Sales: = SUMX( Sales, Sales[Quantity] * RELATED('Product'[Unit price]))
총 네가지 경우의 WINDOW DAX Function 사례들을 아래와 같이 표현하고 설명하였는데, 주로 REL 하고 ABS를 나는 어떻게 이해하였는지에 대해서 설명하였다.
이번 블로그에서는 설명하지 않았지만, REL 과 ABS와 함께 사용하는 숫자들은, 숫자 뿐만이 아니라, 또다른 DAX measure로도 표현이 가능하다. 이건 다음번에 작성해 보도록 하겠다.
또한 ORDERBY도 이번 블로그에서는 날짜순서기준으로 하였지만, 알파벳순서, 알파벳카테고리를 정의한 index순서, 또는 큰값->작은값 순서로도 sorting할 수가있다. 특히 큰값->작은값 순서로 sorting하게되면 Pareto analysis 또는 80:20 분석을 하는데 매우 유용한데, 이것도 다음번에... 이번 블로그 반응이 좋으면 ...
첫번째 WINDOW DAX Function 사용사례로, 아래의 DAX measure를 작성해여, three months rolling sum을 표현하였다.
Three months rolling sum: = CALCULATE ( [Sales:], WINDOW ( -2, REL, 0, REL, ALL ( 'Calendar'[Year], 'Calendar'[Quarter-Year], 'Calendar'[End of quarter], 'Calendar'[Month-Year], 'Calendar'[End of month] ), ORDERBY ( 'Calendar'[End of month], ASC ) ) )
아래의 그림은 윗 그림을 상세하게 설명해 놓은 그림이다.
두번째 WINDOW DAX Function 사용사례로, monthly cumulate sum을 표현하였다.
Monthly cumulate sum: = CALCULATE ( [Sales:], WINDOW ( 1, ABS, 0, REL, ALL ( 'Calendar'[Year], 'Calendar'[Quarter-Year], 'Calendar'[End of quarter], 'Calendar'[Month-Year], 'Calendar'[End of month] ), ORDERBY ( 'Calendar'[End of month], ASC ) ) )
세번 WINDOW DAX Function 사용사례로, monthly cumulate sum within the same quarter를표현하였다.
Monthly cumulate sum within the same quarter: = CALCULATE ( [Sales:], WINDOW ( 1, ABS, 0, REL, ALL ( 'Calendar'[Year], 'Calendar'[Quarter-Year], 'Calendar'[End of quarter], 'Calendar'[Month-Year], 'Calendar'[End of month] ), ORDERBY ( 'Calendar'[End of month], ASC ), KEEP, PARTITIONBY ( 'Calendar'[Quarter-Year], 'Calendar'[End of quarter] ) ) )
마지막 네번째 사례로, reverse cumulate sum within the same year을 표현하였다.
Monthly reverse cumulate sum within the same year: = CALCULATE ( [Sales:], WINDOW ( 0, REL, -1, ABS, ALL ( 'Calendar'[Year], 'Calendar'[Quarter-Year], 'Calendar'[End of quarter], 'Calendar'[Month-Year], 'Calendar'[End of month] ), ORDERBY ( 'Calendar'[End of month], ASC ), KEEP, PARTITIONBY ( 'Calendar'[Year] ) ) )
네번째 사례의 경우, 끝나는 지점을 -1, ABS로 표현하였는데, 12번째 월이 각각의 년도 안에서 항상 마지막 월이라는 것이 변하지 않는 사실이라면 12, ABS로도 표현이 가능하다. 하지만 이 부분은 blank value를 다룰 경우에는 생각해야 하는 변수가 많아져서 그냥 -1, ABS로 표현하는 것이 가장 쉽게 이해가 될 것 같다.
위에서 설명한 네가지의 사례들로, 특히 언제 REL을 사용해야 하고 언제 ABS를 사용해야 하는지에 대해서, 그리고 ORDERBY와 PARTIONBY가 어떻게 기능을 하는지에 대해서 그림으로 설명하고자 나름 노력했다.
이 글이 WINDOW DAX function을 이해하고 사용하는데 조금이나마 도움이 되었으면 한다.
Comentarios