我目前正在处理一项家庭作业,该作业需要进行选择,以提取包含与所有其他记录相比具有最大值的特定属性的元素。我已经阅读了许多在线资源,这些资源引用了一个称为最大值的“聚合”关系代数函数,但它们没有描述它是如何使用基本运算符工作的。如何选择包含最大值的属性?
5 回答
您可以仅使用基本运算符很好地表达聚合函数。这是一件很整洁的事情。
假设我们有一个表 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
当然,这一切大多只是学术兴趣,即它表明关系代数是有效的。
假设我们有一个具有属性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 的符号,所以我将解决方案放在我的符号中,其中运算符条件在 {} 中。希望它可以帮助将来的某个人)
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,字段是要比较以获得最大值的属性。表是该字段所在的原始表。
假设我们与属性 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))
max(columnname)
将返回列columnname中的最大值。