Совокупная реляционная алгебра (максимум) - PullRequest
25 голосов
/ 10 февраля 2011

В настоящее время я работаю над домашним заданием, для которого требуется выбор, который извлекает элемент, содержащий определенный атрибут максимального значения, по сравнению со всеми другими записями.Я читал несколько источников в Интернете, которые ссылаются на «совокупную» функцию реляционной алгебры, называемую максимумом, но они не описывают, как она работает, используя основные операторы.Как выбрать атрибут, содержащий максимальное значение?

Ответы [ 5 ]

39 голосов
/ 17 марта 2011

Вы можете очень хорошо выразить агрегатные функции только с основными операторами.Это довольно изящная вещь.

Предположим, у нас есть таблица T, и мы хотели бы найти максимум ее поля "value".Во-первых, мы должны взять декартово произведение T с собой - или, скорее, с копией самого себя, T2.Затем мы выбираем строки, где T.value меньше, чем T2.value: это убирает нам все нежелательные строки, значение которых меньше значения какой-либо другой строки.Чтобы получить максимальные значения, мы должны вычесть эти нежелательные строки из набора всех строк.И это все.По крайней мере, это основная идея, нам также нужно использовать проекции, чтобы получить правильные размеры.

К сожалению, я не знаю, как вставить сюда латекс, но используя нотацию реляционной алгебры, это будет примерно так:

π(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

Конечно, все это в основном представляет только академический интерес, то есть показывает, что реляционная алгебра работает .

3 голосов
/ 30 января 2013

Предположим, у нас есть таблица T с атрибутами a1, a2, ..., an, v , и нам нужно найдите строку, в которой атрибут v имеет максимальное значение по сравнению со всеми другими строками.

Сначала нам понадобится перекрестное произведение T и T '(копия T, в которой v переименовано в v1 ) поэтому мы можем сравнить значения v :

T x ρ{a1, a2, ..., an, v1}T

Во-вторых, выберите строки, где v <<strong> 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 и тестирования с помощью онлайн-курса Стэнфорда RA , так как я не очень понимал нотацию SaT, я поместил здесь решение в своей нотации, в котором условия оператора в {}. Надеюсь, это поможет кому-то в будущем)

1 голос
/ 29 апреля 2011
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, поле - это атрибут, который вы хотите сравнить, чтобы получить максимальное значение. Таблица - это исходная таблица, где это поле.

0 голосов
/ 20 января 2014

давайте подумаем, что у нас есть связь с атрибутом 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, целое число A1)

A2<A1

1|2
1|3
2|3

слышать, что всегда значения 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))
0 голосов
/ 10 февраля 2011

max(<em>columnname</em>) вернет самое высокое значение в столбце имя столбца .

...