2011-11-14 4 views
0

저는 회사의 구매 보고서를 제공하기위한 기본적인 스타 스키마를 구현하고 있습니다. 팩트 테이블은 4 차원으로 요약되고 매일, 매주, 매월 및 연간 합계로 집계됩니다.PHP에서의 간단한 데이터웨어 하우징 날짜 간 간격

코드는 현재 일, 주, 월 및 년 보고서를 처리하는 방법을 알고 있습니다. 다음 단계는 임의의 날짜 범위보고를 구현하는 것입니다. 범위를 제공하면 목표는 두 날짜 사이의 총 연수, 월, 주 및 일 수를 파악하고 합계를 계산할 적절한 기록을 가져 오는 것입니다. 문제는 경과 된 시간뿐만 아니라 두 날짜 사이의 각 전체 기간의 수를 결정해야한다는 것입니다.

예를 들어 '2009-06-29'와 '2011-06-29'사이에 2 년이 경과되었지만이 범위는 1 년 (2010 년), 11 개월 (1 월 - May/10 & Jul-Dec/09) 및 58 일 (Jun 1-29/09 & Jun 1-29/11).

이 결과를 통해 이미 70 개의 세부 기간에서 요약 된 레코드를 가져 와서 결합하고 합계를 표시 할 수 있습니다.

날짜 범위를 구성 요소로 분해하는 최선의 방법을 결정하기 위해 테스트 코드를 작성했지만,이 프로세스를 지나치게 의심하고있는 것으로 보아서 다시 스테핑하고 있습니다. 현재 초안은 다음과 같이 작동합니다 :

  1. "datesToParse"배열에 초기 날짜 범위를 채 웁니다.
  2. 날짜 사이에 하나 이상의 전체 연도가 존재하는지 확인하십시오.
    • 날짜 사이의 각 기간에 대해 해당 기간을 기간에서 제거하고 "기간 전"및 "기간 후"를 두 개의 새로운 기간으로 나눕니다.
    • "datesToParse"스택에서 두 개의 새로운 기간을 푸시합니다.
    • 반복 가능한 모든 년은 "datesToParse"배열에서 제거 된
  3. , 월, 주 및 일의 과정을 반복합니다.

이론적으로 이것은 초기 날짜 범위를 전체 연도, 월, 주 및 일의 집합으로 재귀 적으로 줄여야합니다.

더 좋은 방법이 있나요? 이것은 전에 여러 번 해결 된 문제처럼 보입니다.

+1

해당 기간의 모든 집계 된 일일 총계를 선택하고 SQL에서 합계 할 수는 없습니까? – liquorvicar

답변

1

그런 복잡한 솔루션을 구현하려는 이유를 이해하지 못합니다. 일반적인 구현에서는 가장 낮은 수준의 데이터 (사실 일일 경우)와 사실상 SUM() 귀하의 질의에 필요한 조치.

구현 및 유지 관리가 매우 간단하며 쿼리 작성이 매우 쉽습니다 (또는보고 도구에서 생성). 이 방법이 효과가 없습니까? 어떤 데이터 량이 있습니까? 날짜를 차원으로 구현했는지 (잘하면 예) 또는 사실 테이블의 값으로 구현 했습니까? 보고 도구 (SSRS, Cognos, Business Objects)를 사용하거나 자신의 쿼리를 롤링하고 있습니까?위에서 설명한대로

  • 데이터
  • 발견 성능을 많이 추가

    1. 것은 하나의 사실 테이블을 구현 : 성능 문제에 대해 생각하는 경우 DWH이 같은 진화하는

      , 그것은 아주 흔한 일 데이터 볼륨 등의 문제가

    2. 인덱싱을
    3. 구현 테이블 분할 개선 증가
    4. Impleme nt OLAP

    당신의 솔루션은 집에서 만든 OLAP 구현과 다소 비슷하지만, 왜 필요한지는 명확하지 않습니다. 데이터 볼륨이 작거나 중간이라면 인덱싱 및 파티셔닝을 통해 데이터 볼륨을 관리 할 수 ​​있습니다. 규모가 크다면 어쨌든 OLAP 및 특수보고 도구를 사용하는 것이 더 많은 문제가 될 수 있습니다. 그러나 당신은 당신의 환경이나 요구 사항에 대한 많은 정보를 제공하지 않았기 때문에 여기서 벗어날 수 있습니다.

  • 관련 문제