关系代数聚合运算(最大值)

24

我目前正在完成一项作业任务,需要进行选取并提取一个包含特定属性最大值的元素,与所有其他记录进行比较。我阅读了许多在线资源,其中提到了一个名为“maximum”的“聚合”关系代数函数,但它们没有使用基本运算符描述其工作原理。如何选择包含最大值的属性?


在某一列中查找最大值并不需要聚合。 - philipxy
如何使用关系代数找到最大值? - philipxy
5个回答

39
您可以只使用基本运算符来表达聚合函数,这是很棒的事情。
假设我们有一个名为T的表格,我们想要找到其“value”字段的最大值。首先,我们应该将T与它自己进行笛卡尔积 - 或者说是与它自己的副本T2进行笛卡尔积。然后,我们选择T.value小于T2.value的行:这将获取所有不需要的行,其值小于另一行的值。为了获得最大值,我们应该从所有行的集合中减去这些不需要的行。就是这样。至少这是基本思想,我们还需要使用投影来正确地调整维度。
不幸的是,我不知道如何在此处插入Latex,但使用关系代数符号,它可能是这样的:
π(T.a1...Tan, T.value)(T)
    -
π(T.a1...Tan, T.value)(
    σ(T.value<T2.value)( ρ(T, T2) x T )
)

其中π是投影运算符,-是集合差运算符,σ是选择运算符,ρ是重命名运算符。

类SQL语言:

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
假设我们有一个表格T,它具有属性a1、a2、...、an、v,我们需要找到与所有其他行相比,属性v具有最大值的行。
首先,我们需要对T和T'(T的副本,其中v被重命名为v1)进行交叉乘积,以便我们可以比较v的值:
T x ρ{a1, a2, ..., an, v1}T

其次,选择v < 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的答案和使用Stanford在线RA课程进行测试来解决这个问题的。由于我不太理解SaT的符号表示法,因此我在这里使用了自己的符号表示法来呈现解决方案,其中运算符条件用{}表示。希望能对未来的某些人有所帮助。


1
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

假设我们有一个带有属性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的,因为我们像这样进行了joina2<a1

现在项目A2的输出如下:

A2
1
2

现在与原始属性不同

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))

-5

max(columnname)会返回列columnname中的最高值。


我理解最大函数的概念。但是,我不知道如何用一系列基本关系运算符替换max()函数的调用。换句话说,我如何只通过调用SELECT、UNION等来执行max()函数? - XBigTK13X
4
那我建议你仔细看一下Sat的回答。 - Erwin Smout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接