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