聚合关系代数(最大值)

时间:2011-02-10 01:18:44

标签: sql aggregate aggregate-functions max relational-algebra

我目前正在进行一项家庭作业,要求进行选择,以拉出包含与所有其他记录相比最大值的特定属性的元素。我在网上阅读了一些引用称为“最大”的“聚合”关系代数函数,但它们没有描述它如何使用基本运算符。如何选择包含最大值的属性?

5 个答案:

答案 0 :(得分: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 )
)

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

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

当然,所有这些主要只是学术兴趣,即它表明关系代数有效

答案 1 :(得分:3)

假设我们的表 T ,其中包含 a1,a2,...,an,v 属性我们需要找到属性 v 的行与所有其他行相比的最大值。

首先,我们需要T和T'的交叉产品(T的副本,其中 v 重命名为 v1 )所以我们可以比较 v 的值:

T x ρ{a1, a2, ..., an, v1}T

其次,选择 v 的行<&lt; v1 ,我们获得 v 值小于 v的所有行 至少在另一行中的值。这些是我们稍后需要排除的行:

σ{v < v1}(T x ρ{a1, a2, ..., an, v1}T)

然后使用T的原始属性(列名称)对列进行投影,以便我们有一个包含T模式的表,其中包含所有不需要的行,这些行将在下一步中从 T 中排除:< / p>

π{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 course进行了测试,因为我并不真正理解SaT的符号,所以我在这里将解决方案放在我的符号中,其中运算符条件在{希望它能帮助将来的某个人)

答案 2 :(得分: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对应,field是要比较的属性以获取最大值。表是该字段所在的原始表。

答案 3 :(得分: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,因为我们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))

答案 4 :(得分:-5)

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