私は現在、他のすべてのレコードと比較して最大値の特定の属性を含む要素を引き出す選択が必要な宿題に取り組んでいます。最大値と呼ばれる「集約」関係代数関数を参照する多くの情報源をオンラインで読みましたが、基本的な演算子を使用してそれがどのように機能するかについては説明していません。最大値を含む属性をどのように選択しますか?
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 )
)
ここで、π は射影演算子、- は差集合、σ は選択演算子、ρ は名前変更演算子です。
SQLっぽい:
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が他のすべての行と比較して最大値を持つ行を見つける必要があるとします。
まず、 vの値を比較できるように、 T と T' ( vがv1に名前が変更されたT のコピー) の外積が必要です。
T x ρ{a1, a2, ..., an, v1}T
次に、v < v1の行を選択すると、少なくとも 1 つの他の行の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に対応し、フィールドは最大値を取得するために比較する属性です。Tableは、そのフィールドがある元のテーブルです。
属性 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列の最高値を返します。