2010-06-07 2 views
1

Я разрабатываю процесс ETL и нуждаюсь в таблице моста для отношения «один ко многим» между таблицей фактов и таблицей измерений (база данных MySQL). Существует ограниченное количество комбинаций (несколько тысяч), поэтому я хочу повторно использовать групповые ключи из таблицы мостов, чтобы ограничить размер.Получить групповой ключ из таблицы моста

Любая группа измерений, относящихся к сути ряд будет состоять из нескольких ключей измерений (от 1 до около 15), присвоенных уникальный ключ группы, как показано ниже:

group_key | dimension_key 
----------------------- 
1   | 1 
1   | 3 
1   | 4 
2   | 1 
2   | 2 
2   | 3 
3   | 1 
3   | 4 

Как я могу идти о извлечение уникального группового ключа для размеров 1,3,4 (то есть 1)?

+0

Можете ли вы уточнить, о чем вы просите? – VeeArr

ответ

1

Я думаю, что вы запрашиваете запрос, который возвращает группы, так что все размеры в определенном списке связаны с группой. То есть строки должны существовать, сопоставляя эту группу с каждым из измерений, и вы хотите знать, какие группы удовлетворяют этому.

SELECT f1.group_key 
FROM facts f1 
JOIN facts f2 ON (f1.group_key = f2.group_key) 
JOIN facts f2 ON (f1.group_key = f2.group_key) 
WHERE f1.dimension_key = 1 
    AND f2.dimension_key = 3 
    AND f3.dimension_key = 4; 

Другое решение для подсчета соответствующих строк в группе:

SELECT f.group_key 
FROM facts f 
WHERE f.dimension_key IN (1,3,4) 
GROUP BY f.group_key 
HAVING COUNT(*) = 3; 

Но я считаю, что, как правило, является GROUP BY производительность убийцы особенно в MySQL.

+0

Ваше первое предложенное решение - именно то, что я ищу! Спасибо :) –

0

Если я вас правильно понимаю, что вы хотите, это мост стол, который выглядит следующим образом:

group_key | dimension_set 
----------------------- 
1   | (1, 3, 4) 
2   | (1, 2, 3) 
3   | (1, 4) 

У вас есть 2 варианта, которые я могу видеть.

Вы можете либо потянуть весь стол моста в программу, либо программно определить групповой ключ из набора измерений.

Или вы можете закодировать ключ измерения с помощью математической формулы, чтобы получить целое число, которое вы можете индексировать.

Нечто вроде a + (b * 32) + (c * 32 * 32) + ... Используйте наименьшую мощность 2, которая включает в себя количество уникальных измерений.

Смежные вопросы