24

我目前正在处理一项家庭作业,该作业需要进行选择,以提取包含与所有其他记录相比具有最大值的特定属性的元素。我已经阅读了许多在线资源,这些资源引用了一个称为最大值的“聚合”关系代数函数,但它们没有描述它是如何使用基本运算符工作的。如何选择包含最大值的属性?

4

5 回答 5

39

您可以仅使用基本运算符很好地表达聚合函数。这是一件很整洁的事情。

假设我们有一个表 T,我们想找到它的“值”字段的最大值。首先,我们应该将 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 )
)

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

SQLishly:

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

当然,这一切大多只是学术兴趣,即它表明关系代数是有效的。

于 2011-03-17T01:33:57.880 回答
3

假设我们有一个具有属性a1、a2、...、an、v的表T ,我们需要找到与所有其他行相比,属性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 的答案和斯坦福在线RA 课程的测试得出这个结论,因为我不太了解 SaT 的符号,所以我将解决方案放在我的符号中,其中运算符条件在 {} 中。希望它可以帮助将来的某个人)

于 2013-01-29T23:26:55.053 回答
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,字段是要比较以获得最大值的属性。表是该字段所在的原始表。

于 2011-04-28T23:24:03.703 回答
0

假设我们与属性 A 和值 1,2,3 有关系

A

1
2
3

所以现在..

项目 A 值并用 A1 重命名

A1
1
2
3

再次项目 A 值并用 A2 重命名

A2
1
2
3

将其与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 最大值

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

\project_{Att}Relation

\diff

\project_{A2}(\rename_{A2}(\project_{Att}Relation)
              \join_{A2<A1}
             \rename_{A1}(\project_{Att}Relation))
于 2014-01-20T13:04:58.713 回答
-5

max(columnname)将返回列columnname中的最大值。

于 2011-02-10T01:40:14.060 回答