Агрегатная Реляционная Алгебра (Максимум)

в настоящее время я работаю над домашним заданием, которое требует выбора, который вытаскивает элемент, содержащий определенный атрибут максимального значения по сравнению со всеми другими записями. Я прочитал несколько источников в интернете, которые ссылаются на" агрегатную " функцию реляционной алгебры под названием 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))

max(columnname) вернет наибольшее значение в столбце columnname.