web-dev-qa-db-ja.com

集約関係代数(最大)

私は現在、他のすべてのレコードと比較して最大値の特定の属性を含む要素を引き出す選択を行う必要がある宿題の割り当てに取り組んでいます。 maximumと呼ばれる「集計」リレーショナル代数関数を参照している多くのソースをオンラインで読みましたが、基本的な演算子を使用してどのように機能するかについては説明していません。最大値を含む属性をどのように選択しますか?

25
XBigTK13X

基本的な演算子だけで集計関数を非常にうまく表現できます。それはかなりきちんとしたことです。

テーブルTがあり、その「値」フィールドの最大値を見つけたいとします。まず、Tのデカルト積をそれ自体、またはむしろそれ自体のコピーであるT2と一緒に使用する必要があります。次に、T.valueがT2.valueよりも小さい行を選択します。これにより、値が他の行の値よりも小さいすべての不要行がネットになります。最大値を取得するには、すべての行のセットからこれらの不要な行を差し引く必要があります。以上です。少なくともそれが基本的な考え方です。寸法を正しくするために投影を使用する必要もあります。

残念ながら、ここにラテックスを挿入する方法がわかりませんが、関係代数表記を使用すると、次のようになります。

π(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

もちろん、これはほとんどが学術的な関心事にすぎません。つまり、関係代数worksであることを示しています。

39
SáT

テーブル[〜#〜] t [〜#〜]属性を持つa1、 a2、...、an、vそして属性vが最大値を持つ行を見つける必要があります他のすべての行と比較して。

まず、TとT 'の外積が必要です(Tのコピーでvv1vの値を比較できるように:

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

次に、v <v1である行を選択します。 v値がvより小さいすべての行を取得します少なくとも1つの他の行の値。これらは、後で除外する必要がある行です。

σ{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の表記法を本当に理解していなかったので、ここでソリューションを自分の表記法に入れました。 {}。将来誰かに役立つことを願っています)

3
alabebop
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に対応し、フィールドは最大値を取得するために比較する属性です。テーブルは、そのフィールドがある元のテーブルです。

1
rolo villalva

属性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}と結合します
so-出力スキーマ:(A2整数、A1整数)

A2<A1

1|2
1|3
2|3

join like that(a2<a1)なので、常にA2の値はA1よりも小さくなります。

プロジェクトA2の出力は次のようになります

A2
1
2

元の属性とdiffになりました

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))
0
bhv