выберите все значения в измерении, для которого существуют факты во всех других измерениях - PullRequest
1 голос
/ 06 апреля 2010

Я попытался упростить этот вопрос для упрощения. Надеюсь, это будет понятно.

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

Мне нужно найти набор состояний, для которых существует хотя бы один почтовый индекс, в котором КАЖДЫЙ клиент имеет хотя бы одну строку фактов на каждый день в измерении времени. Если почтовый индекс имеет только 49 клиентов, мне все равно. Если хотя бы один из 50 клиентов не имеет значения даже в течение 1 дня в почтовом индексе, меня это не волнует. Наконец, мне также нужно знать, какие почтовые индексы определяют состояние для выбора. Обратите внимание, что не требуется, чтобы каждый почтовый индекс имел полный набор данных - только то, что по крайней мере один почтовый индекс имеет.

Я не против сделать несколько запросов и выполнить некоторую обработку на стороне клиента. Это набор данных, который нужно генерировать только один раз в день и можно кэшировать. Я даже не вижу особенно чистого способа сделать это с несколькими запросами, за исключением простой итерации, и в наборе данных чертовски много «почтовых индексов» (на самом деле это не почтовые индексы, а приблизительно 100 000 записей на нижнем уровне иерархии и несколько сотен на верхнем уровне, поэтому zipcode-> state является разумной аналогией)

1 Ответ

1 голос
/ 06 апреля 2010

В качестве первой итерации вы можете попробовать следующее:

Предполагая

  • клиентов (список всех клиентов)
  • zip_codes (список всех почтовых индексов)
  • дней (список всех дней)
  • факты (таблица фактов)

Я считаю, что вы должны сломать его

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)

после того, как вы получите почтовые индексы, должно быть легко присоединить его к штатам.

...