sql - 聚合关系代数(最大值)

标签 sql aggregate aggregate-functions max relational-algebra

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

最佳答案

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

假设我们有一个表 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 )
)

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

沙哑地:
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

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

关于sql - 聚合关系代数(最大值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4952451/

相关文章:

c# - 有没有一种简单的方法可以通过非交换操作进行并行聚合?

MySQL从一组中提取相似数据

c# - 如何通过C#代码在Sql中进行批量更新

php - Oracle 11g DB 返回流而不是字符串

javascript - 如何通过计算任何数组项在 mongodb 聚合中添加新字段

MYSQL - 从相似的行中创建单个记录,为大多数列选择最大长度的值

mysql - 有聚合函数为什么还要把其余的列写到GROUP BY中呢?

mysql - 存储过程返回错误值?

sql - Chef Cookbook 无法使用执行资源运行 sqllocaldb

python - 如何避免在 Python 中两次查找字典以获取/设置键值?