Algèbre Relationnelle Agrégée (Maximum)

Je travaille actuellement sur un devoir qui nécessite une sélection qui extrait un élément contenant un attribut spécifique de valeur maximale par rapport à tous les autres enregistrements. J'ai lu un certain nombre de sources en ligne qui font référence à une fonction d'algèbre relationnelle "agrégée" appelée maximum, mais elles ne décrivent pas comment cela fonctionne en utilisant les opérateurs de base. Comment sélectionner l'attribut contenant une valeur maximale?

25
demandé sur XBigTK13X 2011-02-10 04:18:44

5 réponses

Vous pouvez très bien exprimer des fonctions d'agrégat avec seulement des opérateurs de base. C'est une très bonne chose.

Supposons que nous ayons une table T, et nous aimerions trouver le maximum de son champ" Valeur". Tout d'abord, nous devrions prendre le produit cartésien de T avec lui-même-ou plutôt avec une copie de lui-même, T2. Ensuite, nous sélectionnons les lignes où T. valeur est plus petite que T2.value: ceci nous met toutes les lignes indésirables, dont la valeur est inférieure à la valeur d'une autre ligne. Pour obtenir les valeurs maximales, nous devrait soustraire ces lignes indésirables de l'ensemble de toutes les lignes. Et c'est tout. Au moins, c'est l'idée de base, nous devons également utiliser des projections pour obtenir les bonnes dimensions.

Malheureusement, je n'ai aucune idée de Comment insérer Latex ici, mais en utilisant la notation d'algèbre relationnelle, ce serait quelque chose comme ceci:

π(T.a1...Tan, T.value)(T)
    -
π(T.a1...Tan, T.value)(
    σ(T.value<T2.value)( ρ(T, T2) x T )
)

Où π est l'opérateur de projection, - est la différence d'ensemble, σ est l'opérateur de sélection et ρ est l'opérateur de renommage.

SQLishly:

SELECT T.* FROM T
    MINUS
SELECT T.* FROM T, T as T2 WHERE T.value<T2.value

Et plus pratiquement:

SELECT T.* FROM T LEFT JOIN T as T2 ON T.value<T2.value WHERE T2.value IS NULL

Bien sûr, tout cela n'a pour la plupart qu'un intérêt académique, c'est-à-dire qu'il montre que l'algèbre relationnelle fonctionne.

39
répondu SáT 2011-03-17 01:33:57

Supposons que nous avons la table T avec des attributs a1, a2, ..., un, v et nous avons besoin de trouver la ligne où l'attribut v a la valeur maximale par rapport à toutes les autres lignes.

Tout d'Abord, nous avons besoin d'un produit vectoriel de T et T' (une copie de T où v a été renommé v1) nous pouvons donc comparer les valeurs de v:

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

Ensuite, sélectionnez les lignes où v v1, et nous obtenons toutes les lignes dont le v valeur est inférieure à la v valeur dans au moins une autre ligne. Ce sont les lignes que nous devons exclure plus tard:

σ{v < v1}(T x ρ{a1, a2, ..., an, v1}T)

Ensuite, projetez les colonnes avec les attributs d'origine de T (noms de colonnes) afin que nous ayons une table avec le schéma de T, contenant toutes les lignes indésirables, qui doivent être exclues de T à l'étape suivante:

π{a1, a2, ..., an, v}(σ{v < v1}(T x ρ{a1, a2, ..., an, v1}T))

Enfin, excluez les lignes indésirables de T et nous obtenons la ligne avec un maximum de v valeur:

T - π{a1, a2, ..., an, v}(σ{v < v1}(T x ρ{a1, a2, ..., an, v1}T))

(j'ai travaillé cela sur la base de la réponse de SaT et des tests avec le cours en ligne ra de Stanford , puisque je ne comprenais pas vraiment la notation de SaT, j'ai mis la solution dans ma notation ici, dans laquelle les conditions de l'opérateur sont dans {}. J'espère que cela peut aider quelqu'un dans le futur)

3
répondu alabebop 2013-01-29 23:35:24
table1:= project field (table);
table2 (fieldrenamed):= project field (table);
Producted:=table1 mult table2;
minors:= select fild<fieldrenamed (producted);
result:=table1 difference (project field(minors)); 

Le Code correspond à winRDBI, field est l'attribut que vous souhaitez comparer pour obtenir la valeur maximale. Table est la table d'origine où se trouve ce champ.

1
répondu rolo villalva 2012-01-26 14:30:33

Pensons que nous avons une relation avec un attribut A et des valeurs 1,2,3

A

1
2
3

Alors maintenant..

projetez les valeurs A et renommez avec A1

A1
1
2
3

Encore projetez les valeurs A et renommez avec A2

A2
1
2
3

Rejoignez ceci avec A2<A1 c'est-à-dire \join_{A2<A1}
donc, le schéma-Output: (A2 entier, A1 entier)

A2<A1

1|2
1|3
2|3

Entendre toujours les valeurs A2 seront inférieures à A1 parce que nous join comme ça(a2<a1)

Maintenant projet A2 la sortie est comme ci-dessous

A2
1
2

Maintenant diff avec l'attribut original

A diff A2

A
1
2
3

 diff

A2
1
2

La sortie est 3 qui est la valeur maximale

Salut, je sais que quelqu'un doit aider à l'édition, pour un meilleur look

\project_{Att}Relation

\diff

\project_{A2}(\rename_{A2}(\project_{Att}Relation)
              \join_{A2<A1}
             \rename_{A1}(\project_{Att}Relation))
0
répondu bhv 2014-01-20 13:04:58

max(columnname) sera de retour la valeur la plus élevée dans la colonne columnname.

-5
répondu Dave O. 2011-02-10 01:40:14