データベースを使用して、リレーショナル代数を使用してMAXを見つけるにはどうすればよいですか?
単一の属性 'a'を持つリレーションAがあると仮定します(これへのより複雑なリレーションの削減は、リレーショナル代数の単純なタスクです。これまでのところ得られたと思います)。 Aの値.
それを行う1つの方法は、Aとそれ自体の外積を見つけることです。「a」の名前を変更して、新しいリレーションに異なる名前の属性が含まれるようにしてください。例えば:
(「a」の名前を「a1」に変更)X(「a」の名前を「a2」に変更)
「a1」<「a2」を選択すると、結果のリレーションには最大値を除くすべての値が含まれます。最大値を取得するには、元の関係の違いを見つけるだけです。
(A x A) - (select 'a1' < 'a2') ((rename 'a' as 'a1')(A) x (rename 'a' as 'a2')(A))
次に、project
演算子を使用して、Tobi Lehmanが以下のコメントで提案しているように、1列に減らします。
これをリレーショナル代数記法で書くのは正しいでしょう(私が正しく覚えていれば)。最終的な名前変更(つまり、ρ)は、元のリレーションと同じ名前を持つ属性に終わることに注意してください。
ρa/a1(πa1((A x A)-σa1 <a2 (ρa1/a(A)xρa2/a(A))))
今日自分でこれを解決しようとしていたちょうど2セント。
A = 1,2,3があるとします
使用する場合
A x A - (select 'a1' < 'a2') ((rename 'a' as 'a1')(A) x (rename 'a' as 'a2')(A))
1 | 1、2 | 1,3 | 2,3 | 1,3 | 2,3 | 3のような2つの列ではなく、単一の最大値は取得されません。
3つだけを取得する方法は
project(a)A - project(a1)((select 'a1' < 'a2') ((rename 'a' as 'a1')(A) x (rename 'a' as 'a2')(A)))
少なくともそれは私が同じような状況でやらなければならなかったことです。
それが誰かを助けることを願っています
属性Aと値1,2,3との関係があると考えてみましょう
A
1
2
3
だから今..
project Aの値とA1の名前の変更
A1
1
2
3
再びAの値を投影し、A2で名前を変更します
A2
1
2
3
A2<A1
でこれに参加します。つまり\join_{A2<A1}
so-出力スキーマ:(A2整数、A1整数)
A2<A1
1|2
1|3
2|3
join
がそのように(a2<a1
)
現在、プロジェクトA2の出力は以下のようになっています
A2
1
2
元の属性との差分
A diff A2
A
1
2
3
diff
A2
1
2
出力は3
で、最大値です
こんにちは、見栄えを良くするために編集に協力しなければならない人がいます
リレーショナル代数 構文のほとんどを忘れてしまいました。 SELECT
、PROJECT
、MINUS
およびRENAME
のみを使用したクエリは、
SELECT v1.number
FROM values v1
MINUS
SELECT v1.number
FROM values v1 JOIN values v2 ON v2.number > v1.number
うまくいけば翻訳できます!
私はこれが古いことを知っていますが、これは便利かもしれない手書きの数式です!
関係A:1,2,3,4
1. First we want to PROJECT and RENAME relation A
2. We then to a THETA JOIN with the test a1<a2
3. We then PROJECT the result of the relation to give us a single set of values
a1: 1,2,3 (not max value since a1<a2)
4. We then apply the difference operator with the original relation so:
1,2,3,4 --- 1,2,3 returns 4
4 is the Max value.
Project x(A) - Project A.x
(Select A.x < d.x (A x Rename d(A)))