2011-03-13 4 views
0

사실 테이블에서 고유 한 사실 수를 계산하는 계산 된 계수를 어떻게 만들 수 있는지 알아 내려고합니다. 사실 테이블은 기본적으로 역사적인 관점에서 이벤트를 저장합니다. 하지만 중복 이벤트를 필터링하는 방법이 필요합니다.
sales를 예제로 사용합니다 (OLAP 관련 모든 자료는 예제에서 항상 sales를 사용하므로) :

팩트 테이블은 판매 이벤트를 저장합니다. 판매가 처음 만들어지면 팩트 테이블의 열인 고유 한 영업 참조가 생깁니다. 그러나 고유 판매는 (항목 추가 또는 반환) 수정하거나 완전히 취소 할 수 있습니다. 팩트 테이블은 이러한 변경 사항을 다른 행으로 판매에 저장합니다.

SSAS를 사용하여 계산 계수를 만들면 모든 판매 이벤트 수를 얻게됩니다. 즉, 고유 한 판매가 모든 변경 사항에 대해 여러 번 계산됩니다 (일부 보고서에서는 바람직 함). 그러나 나는 또한 유일한 판매 참고 계산에 근거를두기보다는 사건보다는 오히려 유일한 판매의 조사를 일으키는 측정을 원한다. 사용자가 날짜별로 필터링하면 해당 날짜에 여전히 존재하는 고유 한 매출을 볼 수 있습니다 (해당 날짜까지 판매가 취소 된 경우 계산에 포함되지 않아야 함).

계산 된 계수 특정 셀에서만 집계

MDX/SSAS에서 어떻게합니까? 그것은 시간 차원을 기반으로 판매에 대한 최신 변경 사항을 찾는 쿼리의 하위 집합에서 카운트 쿼리 작업이 필요한 것 같습니다. SQL에서 그것은 무언가 같이 될 것이다 :

SELECT COUNT(*) FROM SalesFacts FACT1 WHERE Event <> 'Cancelled' AND
Timestamp = (SELECT MAX(Timestamp) FROM SalesFact FACT2 WHERE FACT1.SalesRef=FACT2.SalesRef)

가 가능 또는 성능이 좋은 이벤트가 MDX에 하위 쿼리를 가지고?

+0

BTW, 즉 SQL에서 카운트를 수행하는 성능이 좋은 방법이 아니다 : 그는 약 (약간 털이) 솔루션을 말한다 크리스 웹이의 블로그에 최근 게시물이있다. 이벤트 ID의 뚜렷한 카운트 (특히, 인덱스되는 경우)가 훨씬 더 좋습니다. 또는 'Row_number over ...'유형 접근. 위의 내용은 상당한 양의 데이터로 인해 사망 할 것입니다. – piers7

답변

0

SSAS에서 고유 한 트랜잭션 ID (판매 번호 또는 주문 번호)를 기반으로 측정 값을 만든 다음 해당 측정 값을 속성 창에서 'DistinctCount'집계 함수로 만듭니다.

이제는 자체적으로 발견 한 치수 슬라이스에서 고유 한 주문 번호를 계산해야합니다.

0

게시 된 쿼리는 아마 다음과 같이 다시 쓸 수 있습니다

SELECT COUNT(DISTINCT SalesRef) 
FROM SalesFacts 
WHERE Event <> 'Cancelled' 
0

간단한 대답은 단지 '초기의 1을 공급하여 사실보기/DSV 쿼리에서의 판매 수'열이하는 것 이벤트에 대한 모든 하위 개정에 대해서는 0이고 이벤트가 취소되면 -1입니다. 이 '저널링'접근법은 증분 팩트 테이블로드와 함께 훌륭하게 작동합니다.

장기적으로 볼 때 더 유용 할 수있는 또 다른 접근법은 이벤트 차원을 갖는 것입니다. 그러면 사실에있는 특정 측정 값을 기준으로 비어 있지 않은 해당 차원의 구성원 수인 계산 된 측정 값을 노출 할 수 있습니다 표. 그러나 판매의 경우 이는 본질적으로 축약 차원 (사실 테이블을 기반으로 한 차원)이며 매우 커질 수 있습니다. 이것은 부적절 할 수 있습니다.

때로는 요구 사항이 더 복잡 할 수 있습니다. 시간에 따라 슬라이싱하는 경우, 나중에 취소 된 경우에도 ,의 모든 별개의 이벤트를 알아야합니까? 즉 까다로운 시작 :

http://cwebbbi.wordpress.com/2011/01/22/solving-the-events-in-progress-problem-in-mdx-part-2role-playing-measure-groups/