2010-04-06 10 views
1

Я попытался упростить для этого вопроса. Надеюсь, это будет понятным.выберите все значения из измерения, для которого есть факты во всех других измерениях.

В принципе, у меня есть таблица фактов с измерением времени, другим измерением и иерархическим измерением. Для целей вопроса давайте предположим, что иерархическое измерение - это почтовый индекс и состояние. Другое измерение просто описательно. Назовем его «заказчиком». Предположим, что есть 50 клиентов.

Мне нужно найти набор состояний, для которых есть хотя бы один почтовый индекс, в котором каждый клиент имеет по крайней мере одну строку фактов для каждого дня в измерении времени. Если у zip-кода есть только 49 клиентов, я не забочусь об этом. Если даже один из 50 клиентов не имеет значения даже на один день в почтовом индексе, мне все равно. Наконец, мне также нужно знать, какие почтовые коды квалифицировали состояние для выбора. Обратите внимание, что нет необходимости, чтобы каждый почтовый индекс имел полный набор данных - только по крайней мере один почтовый индекс.

Я не против делать несколько запросов и выполнять некоторую обработку на стороне клиента. Это набор данных, который нужно генерировать только один раз в день и может быть кэширован. Я даже не вижу особо чистого способа сделать это с несколькими запросами, кроме простой итерации грубой силы, и в наборе данных есть много «почтовых индексов» (на самом деле это не почтовые индексы, но там приблизительно 100000 записей в нижнем уровне иерархии и нескольких сот в верхнем уровне, так 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