2010-04-06 5 views
1

이 질문을하기 위해 단순화하려고했습니다. 다행히도, 이것은 이해할 수있을 것입니다.다른 모든 차원에 사실이있는 차원의 모든 값 선택

기본적으로 시간 차원, 다른 차원 및 계층 적 차원이있는 사실 테이블이 있습니다. 질문의 목적을 위해 계층 적 차원이 우편 번호 및 상태라고 가정합니다. 다른 차원은 단지 설명 적입니다. '고객'이라고 부르 자 50 명의 고객이 있다고 가정 해 봅시다.

모든 고객이 시간 차원에서 매일 매일 적어도 하나의 팩트 행을 갖고있는 우편 번호가 하나 이상있는 상태 집합을 찾아야합니다. 우편 번호에 49 명의 고객 만있는 경우에는 신경 쓰지 않아도됩니다. 심지어 50 명의 고객 중 한 명이라도 우편으로 1 일 동안 가치가 없다면 나는 그것에 관심이 없다. 마지막으로, 어떤 우편 번호가 선택을위한 국가 자격이 있는지도 알아야합니다. 모든 우편 번호에 전체 데이터 세트가 있어야한다는 요구 사항은 없습니다. 우편 번호 하나 이상 만 있으면됩니다.

여러 개의 쿼리를 만들고 클라이언트 측에서 일부 처리를해도 상관 없습니다. 이것은 하루에 한 번만 생성되고 캐싱 될 수있는 데이터 집합입니다. 나는 심지어 단순한 무차별 대입 반복 (brute-force iteration)에 못 미치는 여러 개의 쿼리를 사용하여이를 수행하는 특히 깨끗한 방법을 보지 못했고 데이터 세트에 많은 '우편 번호'가 들어있다. (실제로는 우편 번호가 아니지만 그곳에는 최상위 레벨의 계층 구조와 수백의 낮은 수준에서 약 10 만 개 항목이 있으므로 zipcode-> 상태는 다음과 같은 시도 할 수있는 첫 번째 반복으로 적절한 비유)

+0

어떤 데이터베이스입니까? – Unreason

+0

postgresql 8.3.x – ideasculptor

답변

1

입니다 :

가정

  • 고객 (전체 고객 목록)
  • zip_codes (모든 우편 번호 목록) S)
  • 일 (모든 일의 목록)
  • 사실 (팩트 테이블)

난 당신이

1을 무너 뜨리는 믿습니다) 고객과 모든에 대한 사실이 우편 번호를 얻을 수 모든 고객을 참아이 결과 집합 검사에서 하루

SELECT zip_id, customer_id, COUNT(DISTINCT days) 
FROM facts 
GROUP BY zip_id, customer_id 
HAVING COUNT(DISTINCT days) = (SELECT COUNT(*) FROM days) 

2)

SELECT zip_id, COUNT(DISTINCT customer_id) 
FROM ( 
    SELECT zip_id, customer_id, COUNT(DISTINCT days) 
    FROM facts 
    GROUP BY zip_id, customer_id 
    HAVING COUNT(DISTINCT days) = (SELECT COUNT(*) FROM days) 
    ) S 
GROUP BY zip_id 
HAVING COUNT(DISTINCT customer_id) = (SELECT COUNT(*) FROM customers) 

우편 번호를 얻은 후에는 상태에 쉽게 가입 할 수 있어야합니다.

+0

감사합니다. 나는 왜 내가 그 주위에 머리를 감싸는 데 많은 어려움을 겪고 있는지 잘 모른다. – ideasculptor