Как мне найти МАКС с реляционной алгеброй? - PullRequest
53 голосов
/ 31 марта 2011

Работая с базами данных, как я могу найти MAX, используя реляционную алгебру?

Ответы [ 7 ]

70 голосов
/ 25 октября 2011

Предполагая, что у вас есть отношение A с одним атрибутом 'a' (сокращение более сложного отношения до этого - простая задача в реляционной алгебре, я уверен, что вы дошли до этого), так что теперь вы хотитенайти максимальное значение в A.

Один из способов сделать это - найти перекрестное произведение A с самим собой, не забудьте переименовать «a», чтобы у вашего нового отношения были атрибуты с разными именами.например:

(переименуйте 'a' в 'a1') X (переименуйте 'a' в 'a2')

теперь выберите 'a1' <'a2', результирующее отношение будетесть все значения, кроме максимального.Чтобы получить максимум, просто найдите разницу между вашим исходным отношением: </p>

(A x A) - (select 'a1' < 'a2') ((rename 'a' as 'a1')(A) x (rename 'a' as 'a2')(A))

Затем используйте оператор project, чтобы уменьшить до одного столбца, как предлагает Тоби Леман в комментарии ниже.

Запись этого в нотации реляционной алгебры будет (если я правильно помню).Обратите внимание, что окончательное переименование (т. Е. Ρ) просто заканчивается атрибутом с тем же именем, что и в исходном отношении:

ρ a / a1 a1 ((A x A) - σ a1 (ρ a1 / a (A) x ρ a2 / a (A))))

36 голосов
/ 27 января 2013

Только мои два цента, когда я пытался решить это сегодня сам.

Допустим, у нас есть A = 1,2,3

Если вы используете

A x A - (select 'a1' < 'a2') ((rename 'a' as 'a1')(A) x (rename 'a' as 'a2')(A))

вы не получите одно максимальное значение, а два столбца, такие как 1 | 1, 2 | 1,3 | 2,3 | 1,3 | 2,3 | 3

способ получить только 3 -

project(a)A - project(a1)((select 'a1' < 'a2') ((rename 'a' as 'a1')(A) x (rename 'a' as 'a2')(A)))

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

Надеюсь, это кому-нибудь поможет

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

давайте подумаем, что у нас есть связь с атрибутом A и значениями 1,2,3

A

1
2
3

так что теперь ..

значения проекта А и переименовать с А1

A1
1
2
3

снова значения проекта А и переименовать с помощью А2

A2
1
2
3

присоединиться к этому с A2<A1 т.е. 1011 *
поэтому - Схема вывода: (целое число 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 что является максимальным значением

Привет, я знаю, что кто-то должен помочь в редактировании, для лучшего взгляда

19 голосов
/ 31 марта 2011

Я забыл большую часть синтаксиса реляционной алгебры . Запрос, использующий SELECT, PROJECT, MINUS и RENAME, будет

SELECT v1.number
FROM values v1
MINUS
SELECT v1.number
FROM values v1 JOIN values v2 ON v2.number > v1.number

Надеюсь, вы сможете перевести!

5 голосов
/ 01 ноября 2014

Я знаю, что это старо, но вот рукописная формула, которая может быть полезна!

enter image description here

Отношение A: 1,2,3,4

1. First we want to PROJECT and RENAME relation A
2. We then to a THETA JOIN with the test a1<a2
3. We then PROJECT the result of the relation to give us a single set of values 
   a1: 1,2,3 (not max value since a1<a2)

4. We then apply the difference operator with the original relation so: 
   1,2,3,4 --- 1,2,3 returns 4

   4 is the Max value.
3 голосов
/ 03 августа 2017

Найдите МАКС:

  • Стратегия:

    1. Найдите те x, которые не являются MAX.

      • Переименуйте A отношение как d, чтобы мы могли сравнить каждый A x со всеми остальными.
    2. Используйте set difference, чтобы найти A x, которые не были найдены на предыдущем шаге.

  • Запрос: enter image description here

1 голос
/ 01 августа 2017

 Project x(A) - Project A.x
(Select A.x < d.x (A x Rename d(A)))
...