Агрегатная Реляционная Алгебра (Максимум)
в настоящее время я работаю над домашним заданием, которое требует выбора, который вытаскивает элемент, содержащий определенный атрибут максимального значения по сравнению со всеми другими записями. Я прочитал несколько источников в интернете, которые ссылаются на" агрегатную " функцию реляционной алгебры под названием maximum, но они не описывают, как она работает с использованием основных операторов. Как выбрать атрибут, содержащий максимальное значение?
5 ответов
вы можете очень хорошо выразить агрегатные функции только с базовыми операторами. Это довольно аккуратная вещь.
предположим, что у нас есть таблица T, и мы хотели бы найти максимум ее поля "значение". Во-первых, мы должны взять декартово произведение T с собой-или, скорее, с его копией, T2. Затем мы выбираем строки, где T. значение меньше T2.значение: это Сети нас всех нежелательного строки, значение которых меньше значения какой-либо другой строки. Чтобы получить максимум значения, мы должны вычесть эти нежелательные строки из набора всех строк. И это все. По крайней мере, это основная идея, нам также нужно использовать проекции, чтобы получить правильные размеры.
к сожалению, я понятия не имею, как вставить Latex здесь, но используя нотацию реляционной алгебры, это было бы примерно так:
π(T.a1...Tan, T.value)(T)
-
π(T.a1...Tan, T.value)(
σ(T.value<T2.value)( ρ(T, T2) x T )
)
где π-оператор проекции, - - разность множеств, σ-оператор выделения, ρ-оператор переименования оператор.
SQLishly:
SELECT T.* FROM T
MINUS
SELECT T.* FROM T, T as T2 WHERE T.value<T2.value
и более практично:
SELECT T.* FROM T LEFT JOIN T as T2 ON T.value<T2.value WHERE T2.value IS NULL
конечно, все это в основном лишь академический интерес, т. е. он показывает, что реляционная алгебра работает.
Предположим у нас есть таблица T С атрибутами a1, a2,..., в, в и нам нужно найти строку, где атрибут v имеет максимальное значение по сравнению со всеми остальными рядами.
во-первых, нам нужно перекрестное произведение T и T' (копия T, где v была переименована в v1) так мы можем сравнить значения v:
T x ρ{a1, a2, ..., an, v1}T
во-вторых, выберите строки, где v v1, и мы получаем все строки которого v значение меньше v значение по крайней мере в одной строке. Это строки, которые нам нужно исключить позже:
σ{v < v1}(T x ρ{a1, a2, ..., an, v1}T)
затем проецируйте столбцы с исходными атрибутами T (имена столбцов), чтобы у нас была таблица с T схема, содержащая все нежелательные строки, которые должны быть исключены из T следующий шаг:
π{a1, a2, ..., an, v}(σ{v < v1}(T x ρ{a1, a2, ..., an, v1}T))
наконец, исключите ненужные строки из T, и мы получим строку с максимумом v значение:
T - π{a1, a2, ..., an, v}(σ{v < v1}(T x ρ{a1, a2, ..., an, v1}T))
(Я разработал это на основе ответа SaT и тестирования со Стэнфордом в интернете курс РА, поскольку я действительно не понял нотацию SaT, я поместил решение в свою нотацию здесь, в которой оператор условия находятся в {}. Надеюсь, это может помочь кому-то в будущем)
table1:= project field (table);
table2 (fieldrenamed):= project field (table);
Producted:=table1 mult table2;
minors:= select fild<fieldrenamed (producted);
result:=table1 difference (project field(minors));
код соответствует winRDBI, поле-это атрибут, который вы хотите сравнить, чтобы получить максимальное значение. Таблица-это исходная таблица, в которой находится это поле.
давайте подумаем, что у нас есть отношение с атрибутом A и значениями 1,2,3
A
1
2
3
Итак..
проецируйте значения A и переименуйте их с помощью A1
A1
1
2
3
снова проецируйте значения A и переименуйте с помощью A2
A2
1
2
3
присоединиться к этому с A2<A1
я.е \join_{A2<A1}
таким образом, схема вывода: (A2 integer, A1 integer)
A2<A1
1|2
1|3
2|3
hear всегда значения A2 будут меньше A1, потому что мы join
как это (a2<a1
)
теперь проект A2 выход, как показано ниже
A2
1
2
теперь diff с оригинальным атрибутом
A diff A2
A
1
2
3
diff
A2
1
2
выход 3
что является максимальным значением
Привет, я знаю, кто-то должен помочь в редактировании, для лучшего взгляда
\project_{Att}Relation
\diff
\project_{A2}(\rename_{A2}(\project_{Att}Relation)
\join_{A2<A1}
\rename_{A1}(\project_{Att}Relation))