使用数据库,如何使用关系代数找到MAX?
答案 0 :(得分:70)
假设你有一个关系,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))
然后使用project
运算符缩减为单列,正如Tobi Lehman在下面的评论中所建议的那样。
在关系代数符号中写这个(如果我没记错的话)。请注意,最终的重命名(即ρ)只是以与原始关系中的名称相同的属性结束:
ρ a / a1 (π a1 ((A x A) - σ a1&lt; a2 (ρ a1 / a (A)xρ a2 / a (A))))
答案 1 :(得分:36)
我今天试图解决这个问题只是我的两分钱。
假设我们有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)))
至少这是我在类似情况下必须做的事情。
希望它有助于某人
答案 2 :(得分:21)
让我们认为我们与属性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
现在使用原始属性进行差异
A diff A2
A
1
2
3
diff
A2
1
2
输出为3
这是最大值
嗨,我知道有人必须帮助编辑,以便更好看
答案 3 :(得分:19)
我现在已经忘记了大部分relational algebra语法。仅使用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
希望你能翻译!
答案 4 :(得分: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.
答案 5 :(得分:3)
找到MAX:
答案 6 :(得分:1)
Project x(A) - Project A.x
(Select A.x < d.x (A x Rename d(A)))