65 votes

Comment puis-je trouver MAX avec l'algèbre relationnelle?

Travailler avec des bases de données, comment puis-je trouver MAX en utilisant l'algèbre relationnelle ?

0 votes

88voto

Dan Points 18107

En supposant que vous avez une relation, A, avec un seul attribut, 'a' (réduire une relation plus complexe à cela est une tâche simple en algèbre relationnelle, je suis sûr que vous êtes allé jusqu'ici), donc maintenant vous voulez trouver la valeur maximale dans A.

Une façon de le faire est de trouver le produit croisé de A avec lui-même, assurez-vous de renommer 'a' pour que votre nouvelle relation ait des attributs avec des noms distincts. par exemple :

(renommer 'a' en 'a1') X (renommer 'a' en 'a2')

maintenant sélectionnez 'a1' < 'a2', la relation résultante aura toutes les valeurs sauf la valeur maximale. Pour obtenir le max, trouvez simplement la différence entre votre relation originale :

(A x A) - (select 'a1' < 'a2') ((renommer 'a' en 'a1')(A) x (renommer 'a' en 'a2')(A))

Ensuite, utilisez l'opérateur project pour ne conserver qu'une seule colonne comme le suggère Tobi Lehman dans le commentaire ci-dessous.

Écrire ceci en notation algébrique relationnelle serait (si je me souviens bien). Notez que le dernier renommage (c'est-à-dire ρ) est juste pour obtenir un attribut qui a le même nom que dans la relation originale :

ρa/a1a1((A x A) - σa1 < a2a1/a(A) x ρa2/a(A))))

7 votes

Juste un petit détail, mais l'expression de différence d'ensemble A-(...) devrait être (AxA - (...)), car l'ensemble de droite est rempli de paires. Ensuite, après soustraction de toutes les paires, utilisez l'opérateur de projection pour l'extraire.

1 votes

Cette réponse n'est que partiellement correcte. Tout d'abord, je ne crois pas que A x A soit bien défini car A et A ont des attributs en commun (évidemment, car ils ont les mêmes schémas) et une relation ne peut pas avoir des attributs en double. Vous le notez vous-même, et je suppose que vous avez simplement oublié d'effectuer le même renommage sur le produit cartésien de gauche que sur celui de droite.

1 votes

De plus, vous prenez la différence du produit cartésien de A avec lui-même, et de tous les tuples du produit cartésien de A avec lui-même où a1 < a2. Cela donne une relation où a1 >= a2. Enfin, vous projetez sur a1 et renommez a1 en a, ce qui vous laisse avec la même instance de relation A que celle avec laquelle vous avez commencé. Je suis perplexe quant au fait que cette réponse ait obtenu autant de votes positifs sans avoir été corrigée, mon raisonnement pourrait-il être fautif ? La dernière partie de la réponse de @idipous est la réponse correcte à la question.

44voto

idipous Points 1313

Just my two cents as I was trying to solve this today myself.

Lets say we have A = 1,2,3

If you use

A x A - (select 'a1' < 'a2') ((rename 'a' as 'a1')(A) x (rename 'a' as 'a2')(A))

you will not get the single max value rather two columns like 1|1, 2|1,3|2,3|1,3|2,3|3

the way to get just 3 is

project(a)A - project(a1)((select 'a1' < 'a2') ((rename 'a' as 'a1')(A) x (rename 'a' as 'a2')(A)))

At least that is what I had to do in a similar situation.

Hope it helps someone

32voto

bhv Points 323

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

A

1
2
3

maintenant..

projeter les valeurs de A et les renommer avec A1

A1
1
2
3

encore une fois projeter les valeurs de A et les renommer avec A2

A2
1
2
3

joindre cela avec A2<A1 c'est-à-dire \join_{A2<A1}
donc le - Schéma de sortie : (A2 entier, A1 entier)

A2<A1

1|2
1|3
2|3

ici les valeurs de A2 seront toujours inférieures à celles de A1 car nous faisons un join de cette manière (a2<a1)

maintenant projetons A2 le résultat est le suivant

A2
1
2

maintenant différence avec l'attribut d'origine

A diff A2

A
1
2
3

 diff

A2
1
2

La sortie est 3 valeur maximale

19voto

Martin Smith Points 174101

J'ai maintenant oublié la plupart de la syntaxe de l'algèbre relationnelle. Une requête utilisant simplement les balises SELECT, PROJECT, MINUS et RENAME serait

SELECT v1.number
FROM values v1
MINUS
SELECT v1.number
FROM values v1 JOIN values v2 ON v2.number > v1.number

En espérant que vous pourrez traduire !

5voto

benscabbia Points 8725

Je sais que c'est ancien, mais voici une formule écrite à la main qui pourrait être utile!

entrer la description de l'image ici

Relation A: 1,2,3,4

1. Tout d'abord, nous voulons PROJECT et RENOMMER la relation A
2. Nous faisons ensuite un THETA JOIN avec le test a1

0 votes

@gudthing Je pense que la formule contient une erreur dans le sens où les deux expressions autour de l'opérateur - devraient changer de position. la différence de r1(X) et r2(X) est exprimée comme r1 r2 et est une relation sur X contenant les tuples qui appartiennent à r1 et non à r2

0 votes

Veuillez utiliser du texte, pas des images/liens, pour le texte (y compris le code, les tableaux et les ERD). Utilisez une image seulement pour compléter le texte et/ou pour ce qui ne peut pas être donné en texte. Et ne donnez jamais un diagramme sans légende/clé. Utilisez les fonctions d'édition pour intégrer, pas des liens, si vous avez la réputation - faites en sorte que votre publication soit auto-suffisante.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X