Dan*_*Dan 73

假设你有一个关系,A,有一个属性,'a'(减少一个更复杂的关系,这是关系代数中的一个简单的任务,我相信你到目前为止),所以现在你想找到最大值A中的值

一种方法是找到A与自身的交叉产品,确保重命名为'a',以便新关系具有不同名称的属性.例如:

(将'a'重命名为'a1')X(将'a'重命名为'a2')

现在选择'a1'<'a2',结果关系将包含除最大值之外的所有值.要获得最大值,只需找到原始关系之间的差异:

(A x A) - (select 'a1' < 'a2') ((rename 'a' as 'a1')(A) x (rename 'a' as 'a2')(A))
Run Code Online (Sandbox Code Playgroud)

然后使用project运算符减少到单个列,正如Tobi Lehman在下面的评论中所建议的那样.

用关系代数表示法写这个(如果我没记错的话).请注意,最终重命名(即ρ)最终只是一个与原始关系同名的属性:

ρa / a1(πa1((A×A) - σa1<a2(ρa1/ a(A)xρa2/ a(A))))

  • 只是一个小的挑选,但设定的差异表达式A - (...)应该是(AxA - (...)),因为右手集合充满了对.然后,在减去所有对之后,使用投影运算符来提取它. (4认同)
  • @gblomqvist 是的,您说得对,我查看了编辑历史记录,最初只有“A - ...”和一条评论说您仍然需要投影,但后来我根据上面的 tlehman 评论对其进行了更改。idipous 的回答更完整 (2认同)

idi*_*ous 37

只是我的两分钱,因为我今天试图解决这个问题.

假设我们有A = 1,2,3

如果你使用

A x A - (select 'a1' < 'a2') ((rename 'a' as 'a1')(A) x (rename 'a' as 'a2')(A))
Run Code Online (Sandbox Code Playgroud)

你不会得到单个最大值而是两个列,如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)))
Run Code Online (Sandbox Code Playgroud)

至少这是我在类似情况下必须做的事情.

希望它可以帮助某人


bhv*_*bhv 21

我们认为我们与属性A和值1,2,3有关系

A

1
2
3
Run Code Online (Sandbox Code Playgroud)

所以现在..

项目A值并用A1重命名

A1
1
2
3
Run Code Online (Sandbox Code Playgroud)

再次投影A值并用A2重命名

A2
1
2
3
Run Code Online (Sandbox Code Playgroud)

加上这个A2<A1 就是\join_{A2<A1}
这样 - 输出模式:(A2整数,A1整数)

A2<A1

1|2
1|3
2|3
Run Code Online (Sandbox Code Playgroud)

总是听到A2值会小于A1,因为我们join喜欢(a2<a1)

现在项目A2的输出如下

A2
1
2
Run Code Online (Sandbox Code Playgroud)

现在diff与原始属性

A diff A2
Run Code Online (Sandbox Code Playgroud)

A
1
2
3
Run Code Online (Sandbox Code Playgroud)

 diff
Run Code Online (Sandbox Code Playgroud)

A2
1
2
Run Code Online (Sandbox Code Playgroud)

输出3 是最大值

嗨,我知道有人必须帮助编辑,以便更好看


Mar*_*ith 19

我现在已经忘记了大部分关系代数语法.查询只使用SELECT,PROJECT,MINUSRENAME

SELECT v1.number
FROM values v1
MINUS
SELECT v1.number
FROM values v1 JOIN values v2 ON v2.number > v1.number
Run Code Online (Sandbox Code Playgroud)

希望你能翻译!


ben*_*bia 5

我知道这是旧的,但这是一个手写的公式,可能很方便!

在此输入图像描述

关系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.
Run Code Online (Sandbox Code Playgroud)


Md.*_*que 5

找到最大值:

  • 战略:

    1. 找到那些x不属于MAX.

      • A将关系重命名为d以便我们可以将每个关系A x与所有其他关系进行比较。
    2. 用于set difference查找A x在先前步骤中未找到的内容。

  • 查询是: 在此输入图像描述