파이썬에서 자기란 무엇인가: 실제 사례
파이썬에서 자기란 무엇인가: 실제 사례
이 자습서에서는 DAX 코드를 살펴보겠습니다. 이미 이와 같은 것을 사용했을 수 있습니다. 또는 이를 발견하고 이 코드가 작동하는 방식과 행 컨텍스트와 필터 컨텍스트가 단일 DAX 코드에서 서로 상호 작용하는 방식에 대해 혼란스러워할 수 있습니다. 어느 쪽이든 이 자습서에서는 위의 모든 내용을 자세히 살펴봅니다. 이 블로그 하단에서 이 튜토리얼의 전체 비디오를 볼 수 있습니다.
먼저 코드 자체를 살펴보겠습니다. 그런 다음 더 잘 이해하기 위해 이론 부분을 살펴보겠습니다. 마지막으로 DAX Studio를 사용하여 비하인드 스토리를 모두 살펴보겠습니다 .
사용할 데이터 모델은 기본적으로 날짜, 판매 및 제품 테이블을 포함하는 간단한 판매 데이터 모델입니다. Sales 테이블에는 각 날짜의 트랜잭션이 포함됩니다. Products 테이블에는 각 날짜의 제품에 대한 판매 정보에 대한 정보가 포함되어 있습니다. Dates 테이블에는 이 자습서의 목적을 위한 몇 개의 열만 포함되어 있습니다.
우리는 Dates 테이블에만 관심이 있지만 Sales 테이블과 Products 테이블을 사용하여 필터 컨텍스트와 행 컨텍스트가 관계의 도움으로 전파되는 방식을 설명할 것입니다.
목차
누계 측정값의 행 컨텍스트 및 필터 컨텍스트
이제 행 및 필터 컨텍스트가 모두 포함되어 있으므로 누계 측정값을 만들어 보겠습니다. 이것은 FILTER에 대해 COUNTROWS를 사용하고 Date 테이블 안에 있는 모든 연도를 반환하는 ALL 함수를 사용하는 기본 누계 측정입니다. 이 측정값을 아래 표로 가져오면 예상한 결과를 얻을 수 있습니다.
이제 해당 DAX 코드가 작동하는 방식을 분석해 보겠습니다.
측정에서 먼저 COUNTROWS가 있지만 이것이 평가되거나 실행되는 첫 번째 함수가 아님을 알 수 있습니다. 그런 다음 FILTER 기능과 ALL이 있습니다. 평가 순서의 첫 번째 항목은 ALL입니다. ALL은 ALL 함수 외부에 존재하는 필터 컨텍스트를 무시하여 Dates Calendar Year Number의 모든 고유 값을 반환합니다.
따라서 지표에는 Calendar Year Number 열이 있으며 해당 열을 능동적으로 필터링하고 있습니다. 그러나 ALL은 기존 필터 컨텍스트를 무시하므로 해당 열의 모든 고유 값을 가져옵니다.
두 번째 인수의 행 컨텍스트에서 Dates Calendar Year Number가 MAX Dates Calendar Year Number보다 작아야 한다고 작성했습니다. 이제 초보자이고 여전히 DAX를 이해하고 학습하려는 경우 왼쪽의 참조와 MAX 함수 내부의 참조가 모두 동일한 열에 속하고 내부에 있는 동일한 테이블이라고 생각할 수 있습니다. 모든 기능.
그러나 그것은 사실이 아닙니다. ALL 함수에 속하는 행 컨텍스트의 유일한 부분은 왼쪽에 있는 부분입니다. MAX에 있는 것은 행 컨텍스트가 아닌 필터 컨텍스트 내에서 평가됩니다.
따라서 FILTER는 첫 번째 인수에 제공한 테이블에서 행 컨텍스트를 만들려고 시도하고 코드의 이 부분은 실제로 해당 특정 행 컨텍스트에서 검색됩니다. 따라서 각 행 FILTER는 ALL 내부에 있는 해당 테이블을 반복한 다음 현재 반복하고 있는 모든 값에 액세스할 수 있습니다.
따라서 첫 번째 반복에서는 값이 하나만 있습니다. 두 번째 반복에는 두 번째 값이 있습니다. 그러나 MAX를 작성할 때 FILTER 함수를 사용하여 생성하는 행 컨텍스트와 독립적입니다. 따라서 MAX는 해당 매트릭스에서 사용한 현재 연도 번호로 생성되는 필터 컨텍스트에서 평가됩니다.
2006에 있을 때 MAX는 2006을 반환하지만 현재 행은 2006, 2007 또는 2008일 수 있습니다. FILTER는 두 번째 인수에서 지정하는 기준을 충족하는 테이블을 반환합니다. 2007년으로 이동하면 MAX는 2007을 반환할 것입니다. 2008년에는 2008을 반환할 것입니다. 그리고 MAX 함수에 의해 반환되는 값보다 작은 모든 값에 따라 FILTER는 테이블.
MAX가 행 컨텍스트에 종속되지 않음을 증명하기 위해 이 DAX 코드 조각을 여러 변수로 분리할 수 있습니다. 그러면 왼쪽 열 참조와 오른쪽 열 참조가 같지 않음을 알 수 있습니다.
그럼 변수를 만들어 봅시다.
아래 측정에서 볼 수 있듯이 세 개의 변수( )를 만들었습니다. 그런 다음 마지막으로 COUNTROWS를 사용하는 변수 Result와 함께 FILTER 코드를 추가했습니다 . 아래 표에서 이 측정값을 사용하면 아무 변화가 없음을 알 수 있습니다. 결과는 여전히 동일합니다. 우리는 여전히 이전에 얻은 것과 동일한 누계를 얻습니다.
코드로 돌아가서 첫 번째 변수의 값을 검색하고 확인하면 각 행에 대해 동일한 연도가 표시됩니다.
따라서 이 특정 코드에서 MAX 함수가 해당 값에 대한 실제 컨텍스트에 실제로 의존하지 않는다는 점을 설명할 수 있었으면 합니다. 그리고 평가 컨텍스트에 대한 이해를 단순화하려는 경우 평가 순서와 코드가 실행되는 방식을 이해할 수 있도록 항상 코드를 여러 변수로 나눌 수 있습니다.
이제 MAX 함수가 FILTER 함수에 의해 생성된 행 컨텍스트에 의존하는 시나리오를 보여드리겠습니다 .
자, 그 측정으로 돌아가 봅시다. 그것을 복제하고 Last Visible Year 대신 MAX Dates Calendar Year Number를 갖게 됩니다. 내가 그것을 매트릭스로 가져왔을 때, 당신은 우리가 공백을 얻는 것을 볼 수 있습니다.
왜?
문제는 우리가 모든 연도를 반복하고 있으며 CALCULATE가 수행하는 작업은 현재 반복되는 행을 동등한 필터 컨텍스트로 변환한다는 것입니다.
여기에 등호를 쓰면 7, 7, 7이 나오는 것을 볼 수 있습니다.
왜?
무슨 일이 일어나고 있는지 쉽게 이해할 수 있도록 계산된 새 표를 만들어 보겠습니다.
새 테이블을 만들겠습니다. 다음으로 모든 날짜 달력 연도 숫자 위에 쓸 것입니다 . 그런 다음 Max Year를 작성한 다음 Dates Calendar Year Number의 MAX에 대해 CALCULATE를 사용합니다. 이제 각 행에 대해 동일한 값을 반복하고 있음을 알 수 있습니다.
이 숫자는 엄격하게 자신보다 작지 않기 때문에 공백이 표시됩니다. 그러나 같음(=)을 사용하면 2011보다 작은 모든 값이 7이 된다는 의미입니다.
또한 Max Year와 같은 측정값 참조를 사용하는 경우에도 이 코드는 작동하지 않습니다.
확인을 클릭하면 여전히 아무 것도 얻지 못한 것을 볼 수 있습니다. 이는 Max Year를 작성할 때 단순히 CALCULATE MAX Dates Calendar Year Number를 작성하기 때문입니다.
측정값 참조에는 항상 외부에 CALCULATE가 있습니다. 따라서 이 측정은 현재 반복되는 행을 필터 컨텍스트로 변환하는 컨텍스트 전환을 시작합니다.
그러나 바인딩되어 있고 측정 참조를 사용해야 하는 경우 할 수 있는 일은 해당 측정을 변수에 저장하는 것입니다. 아시다시피 변수는 일정하며 컨텍스트 전환을 생성할 수 없습니다. 따라서 행 컨텍스트를 필터 컨텍스트로 변환할 수 없습니다.
따라서 행 컨텍스트와 필터 컨텍스트가 DAX 코드에서 서로 어떻게 상호 작용하는지에 대한 빠른 데모입니다.
이제 DAX Studio로 이동하여 뒤에서 무슨 일이 일어나고 있는지 알아보겠습니다.
DAX Studio를 사용하여 행 컨텍스트 및 필터 컨텍스트 이해
외부 도구로 이동하여 DAX Studio를 시작하겠습니다. Query Plan 및 Server Timings 의 도움으로 LuckyTemplates 파일에 연결해야 합니다 .
그런 다음 쿼리 측정값을 만들겠습니다. DEFINE MEASURE를 Dates 테이블에 Dates Running Total이라고 쓰겠습니다. 그런 다음 원래 있던 코드를 사용하겠습니다.
테이블을 반환해야 하므로 EVALUATE를 작성할 수 있습니다. 마지막으로 SUMMARIZECOLUMNS를 사용하여 테이블을 생성합니다. 그래서 우리는 Dates Calendar Year Number와 Running Total이 될 가상 열을 쓸 것입니다. 그런 다음 DT와 같은 것을 DAX Studio 키워드로 작성할 수 있습니다.
이 코드를 실행하면 코드가 완성되고 LuckyTemplates에서 본 것과 동일한 결과를 얻을 수 있습니다.
이제 뒤에서 무슨 일이 일어나고 있는지 이해하기 위해 쿼리 계획으로 이동하겠습니다. MAX 함수가 실제로 행 컨텍스트에 종속되는지 살펴보겠습니다. 물리적 쿼리 계획은 일반적으로 더 복잡하고 읽기 어렵기 때문에 논리적 쿼리 계획으로 이동하겠습니다.
첫 번째 줄의 첫 번째 연산자는 GroupSemiJoin 이고 SUMMARIZECOLUMNS에서 사용하여 두 열 사이에 내부 연결을 생성하는 것을 볼 수 있습니다.
그런 다음 이러한 열을 조인하기 위해 분석 서비스 내부에 있는 스토리지 엔진인 Scan_Vertipaq 이 있습니다 . Dates Calendar Year Number 열이 필요하다는 것을 알 수 있습니다. LuckyTemplates에서 매트릭스에 보고서에 대한 액세스 역할을 하는 달력 연도 열이 있음을 알 수 있습니다.
다음으로 최상위 연산자로 측정값에 COUNTROWS 함수가 있고 COUNTROWS는 필터에 대해 FILTER 함수를 호출합니다. 다시 Scan_Vertipaq 이 있는데 RequiredCols가 Dates Calendar Year Number라고 합니다.
2행과 5행은 동일하지만 첫 번째 Scan_Vertipaq은 0으로 표시되고 두 번째는 1로 표시됩니다. 즉, ALL 함수의 도움으로 액세스하는 열이 SUMMARIZECOLUMNS 함수 내부에 있는 열과 별도로 추출됩니다.
그런 다음 LessThan 연산자 가 있습니다 . 다음 줄에서 행 컨텍스트와 MAX 함수 사이에 비교가 있음을 알 수 있습니다 .
그 다음에는 Max_Vertipaq 가 옵니다 . 따라서 우리는 실제로 스토리지 엔진에서 최대값을 추출하고 있습니다. 오른쪽을 보면 DependOnCols Dates Calendar Year Number라고 되어 있는 것을 볼 수 있습니다. 이것이 우리가 기억해야 할 가장 중요한 것입니다. 앞서 행 컨텍스트에 대한 MAX 함수의 종속성이 없다고 말했고 이것이 실제로 그것을 증명합니다.
그래서 여기에서는 0이라고 말합니다.
우리는 어디에서 0을 찾았습니까?
SUMMARIZECOLUMNS에 대해 추출되는 상단(두 번째 줄)에 있습니다. 즉, MAX 함수는 행 컨텍스트에 의존하지 않지만 실제로는 해당 테이블 안에 있는 열(Calendar Year Number)에 의존합니다. 따라서 해당 테이블은 실제로 필터 컨텍스트를 생성합니다.
즉, MAX 함수는 행 컨텍스트가 아닌 필터 컨텍스트에 종속됩니다.
다음으로 Max_Vertipaq을 계산하기 위해 DependOnCols가 0(날짜 달력 연도 번호)임을 나타내는 Scan_Vertipaq 가 있음을 알 수 있습니다. 그런 다음 열이 필요한 몇 가지 다른 열이 있습니다.
이제 코드의 변수 버전을 살펴보겠습니다. LastVisibleYear를 반환하는 대신 COUNTROWS 버전 또는 Result 변수를 반환할 것이고 여전히 동일한 결과를 얻는 것을 볼 수 있습니다.
쿼리 계획을 보면 조금 더 길지만 읽기가 훨씬 더 쉽다는 것을 알 수 있습니다.
마지막으로 계산된 버전의 코드도 있습니다.
이것이 논리적 쿼리 계획의 모습입니다.
DAX LuckyTemplates: 행 컨텍스트란 무엇입니까?
LuckyTemplates의 필터 컨텍스트 소개
컨텍스트 전환이란 무엇이며 이것이 중요한 이유는 무엇입니까?
결론
이 자습서에서는 주어진 함수가 행 컨텍스트와 상호 작용할 수 있는 방법과 상호 작용할 수 없는 방법을 설명했습니다. 또한 이 경우 MAX가 행 컨텍스트가 아닌 필터 컨텍스트에서 어떻게 평가되는지 보여 주었습니다.
필터 컨텍스트는 전체 모델을 필터링하고 행 컨텍스트는 주어진 테이블만 반복하고 모델을 필터링하지 않는다는 점을 항상 기억하는 것이 중요합니다. 필터 컨텍스트는 테이블을 반복하지 않습니다.
이 튜토리얼이 도움이 되었기를 바랍니다. 곧 출시될 DAX Studio 코드를 기대해 주세요 . 유사한 시나리오에 대해 훨씬 더 깊이 들어갈 것입니다. 또한 DAX 코드를 최적화하는 방법도 알려드립니다.
파이썬에서 자기란 무엇인가: 실제 사례
R의 .rds 파일에서 개체를 저장하고 로드하는 방법을 배웁니다. 이 블로그에서는 R에서 LuckyTemplates로 개체를 가져오는 방법도 다룹니다.
이 DAX 코딩 언어 자습서에서는 GENERATE 함수를 사용하는 방법과 측정값 제목을 동적으로 변경하는 방법을 알아봅니다.
이 자습서에서는 다중 스레드 동적 시각적 개체 기술을 사용하여 보고서의 동적 데이터 시각화에서 통찰력을 만드는 방법을 다룹니다.
이 기사에서는 필터 컨텍스트를 살펴보겠습니다. 필터 컨텍스트는 모든 LuckyTemplates 사용자가 처음에 배워야 하는 주요 주제 중 하나입니다.
LuckyTemplates Apps 온라인 서비스가 다양한 소스에서 생성된 다양한 보고서 및 인사이트를 관리하는 데 어떻게 도움이 되는지 보여주고 싶습니다.
LuckyTemplates에서 측정 분기 및 DAX 수식 결합과 같은 기술을 사용하여 수익 마진 변경을 해결하는 방법을 알아봅니다.
이 자습서에서는 데이터 캐시의 구체화 아이디어와 결과 제공 시 DAX 성능에 미치는 영향에 대해 설명합니다.
지금까지 Excel을 계속 사용하고 있다면 지금이 비즈니스 보고 요구 사항에 LuckyTemplates를 사용하기 시작하는 가장 좋은 시기입니다.
LuckyTemplates 게이트웨이란? 당신이 알아야 할 모든 것