2011-02-10 3 views
25

Je travaille actuellement sur une tâche 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?Algèbre relationnelle agrégée (maximum)

Répondre

39

Vous pouvez très bien exprimer des fonctions d'agrégat avec seulement des opérateurs de base. C'est une jolie chose. Supposons que nous ayons une table T, et nous aimerions trouver le maximum de son champ "valeur". 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.value est plus petit que T2.value: ceci nous filme toutes les lignes non désirées, dont la valeur est inférieure à la valeur d'une autre ligne. Pour obtenir les valeurs maximales, nous devrions 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 ne sais pas comment insérer latex, mais en utilisant la notation de l'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 de jeu, σ est l'opérateur de sélection et ρ est l'opérateur de changement de nom.

SQLishly:

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

Et plus pratique:

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

Bien sûr, tout cela est surtout un intérêt théorique seulement, à savoir qu'il montre que l'algèbre relationnelle fonctionne.

+0

cela vous dérangerait-il de m'aider sur ce point http://stackoverflow.com/questions/30378663/mysql-querying-aggregate-of-non-overlapping-dates? – exodream

-5

max(columnname) retournera la valeur la plus élevée dans la colonne nom de colonne.

+0

Je comprends l'idée de la fonction maximale. Au contraire, je ne vois pas comment je pourrais remplacer un appel à max() par une série d'opérateurs relationnels de base. En d'autres termes, comment pourrais-je effectuer max() en appelant seulement SELECT, UNION, etc? – XBigTK13X

+0

@ XBigTK13X Vous ne pouvez pas. –

+4

@Dave alors je vous suggère de regarder de très près la réponse de Sat. –

1
table1:= project field (table); 
table2 (fieldrenamed):= project field (table); 
Producted:=table1 mult table2; 
minors:= select fild<fieldrenamed (producted); 
result:=table1 difference (project field(minors)); 

code correspondent à winRDBI, le champ est l'attribut que vous voulez comparer pour obtenir la valeur maximale. Table est la table d'origine où ce champ est.

3

Supposons que nous ayons la table T avec des attributs a1, a2, ..., un, v et nous devons 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 croisé de T et T »(une copie de T où v a été renommé v1) afin que nous puissions 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 v valeur est inférieure à la v valeur dans au moins une autre rangée. Ce sont les lignes que nous devons exclure plus tard:

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

projet a ensuite les colonnes avec des attributs originaux de T (nom de colonne) nous avons donc une table avec le schéma de T, contenant toutes les lignes non désirées, qui doivent être exclues de T à l'étape suivante:

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

dernier, ne comprennent pas les lignes indésirables de T et nous obtenons la ligne avec un maximum v valeur:

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

(j'ai travaillé ce sur la base de la réponse de SaT et de test avec Stanford en ligne RA course, puisque je ne comprenais pas vraiment la notation de SaT, je mets la solution dans ma notation ici, dans laquelle les conditions de l'opérateur sont {}. Je espère que ça peut aider quelqu'un à l'avenir)

0

laisse penser que nous avons une relation avec un attribut A et valeurs 1,2,3

A 

1 
2 
3 

maintenant ..

projet de valeurs et renommer avec A1

A1 
1 
2 
3 

nouveau projet, une des valeurs et renommer avec A2

A2 
1 
2 
3 

joindre cela avec A2<A1 i.e \join_{A2<A1}
de sorte que le - schéma de sortie: (entier A2, entier A1)

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)

projettent maintenant A2 la sortie est comme ci-dessous

A2 
1 
2 

maintenant diff avec l'attribut d'origine

A diff A2 

A 
1 
2 
3 

diff 

A2 
1 
2 

sortie est 3 qui est la valeur maximale

Salut, je sais que quelqu'un doit aider à l'édition, pour mieux regarder

Questions connexes