如何用关系代数findMAX?
使用数据库,我如何使用关系代数来findMAX?
假设你有一个关系,A,有一个单一的属性,'a'(减less一个更复杂的关系,这是关系代数中的一个简单的任务,我相信你有这个),所以现在你想find最大A的价值
一种方法是findA与其自身的叉积,确保重命名'a',以便新的关系具有不同名称的属性。 例如:
(将'a'重命名为'a1')X(将'a'重命名为'a2')
现在select'a1'<'a2',得到的关系将具有除最大值之外的所有值。 为了得到最大值只需find你的原始关系之间的差异:
(A x A) - (select 'a1' < 'a2') ((rename 'a' as 'a1')(A) x (rename 'a' as 'a2')(A))
然后,按照Tobi Lehman在下面的评论中所build议的那样,使用project
运营商减less到一个专栏。
用关系代数符号来写这个(如果我没记错的话)。 注意最后的重命名(即ρ)只是以与原始关系具有相同名称的属性结束:
ρa / a1 ( πa1 ((A x A) -σa1 <a2 ( ρa1 / a (A) xρa2 / a (A))))
我自己今天正在试图解决这个问题,就是我的两分钱。
可以说我们有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)))
至less这是我在类似的情况下必须做的。
希望它可以帮助别人
我现在已经忘记了大部分的关系代数语法。 一个查询只是使用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
希望你可以翻译!
让我们认为我们有一个与属性A和值1,2,3的关系
A 1 2 3
所以现在..
项目A值并用A1重命名
A1 1 2 3
再次投影A值并用A2重新命名
A2 1 2 3
join这个A2<A1
ie \join_{A2<A1}
所以 – 输出模式:( A2整数,A1整数)
A2<A1 1|2 1|3 2|3
总是听到A2值会小于A1,因为我们join
那样( a2<a1
)
现在项目A2的输出如下
A2 1 2
现在与原始属性差异
A diff A2
A 1 2 3
diff
A2 1 2
输出是3
,这是最大值
嗨,我知道有人必须帮助编辑,为了更好看
我知道这是旧的,但这是一个手写的公式,可能会很方便!
关系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.
Project x(A) - Project Ax (Select Ax < dx (A x Rename d(A)))
查找最大值:
-
战略:
-
find那些不是
MAX
x
。- 将关系重命名为
d
以便我们可以将每个A
x
与所有其他A
x
进行比较。
- 将关系重命名为
-
使用
set difference
来find在前面的步骤中找不到的那些A
x
。
-
-
查询是: