En travaillant avec des bases de données, comment puis-je trouver MAX en utilisant l'algèbre relationnelle?
En supposant que vous ayez 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 arrivé jusqu'ici), alors maintenant vous voulez trouver le maximum valeur en A.
Une façon de le faire est de trouver le produit croisé de A avec lui-même, assurez-vous de renommer "a" afin que votre nouvelle relation ait des attributs avec des noms distincts. par exemple:
(renommer "a" en "a1") X (renommer "a" en "a2")
sélectionnez maintenant 'a1' <'a2', la relation résultante aura toutes les valeurs sauf le maximum. Pour obtenir le maximum, il suffit de trouver la différence entre votre relation d'origine:
(A x A) - (select 'a1' < 'a2') ((rename 'a' as 'a1')(A) x (rename 'a' as 'a2')(A))
Ensuite, utilisez l'opérateur project
pour réduire à une seule colonne comme le suggère Tobi Lehman dans le commentaire ci-dessous.
L'écrire en notation algèbre relationnelle serait (si je me souviens bien). Notez que le renommage final (c'est-à-dire ρ) consiste simplement à se retrouver avec un attribut qui porte le même nom que dans la relation d'origine:
ρa/a1(πa1((A x A) - σa1 <a2 (ρa1/a(A) x ρa2/a(UNE))))
Juste mes deux cents alors que j'essayais de résoudre ce problème moi-même aujourd'hui.
Disons que nous avons A = 1,2,3
Si tu utilises
A x A - (select 'a1' < 'a2') ((rename 'a' as 'a1')(A) x (rename 'a' as 'a2')(A))
vous n'obtiendrez pas la valeur max unique plutôt que deux colonnes comme 1 | 1, 2 | 1,3 | 2,3 | 1,3 | 2,3 | 3
la façon d'en obtenir seulement 3 est
project(a)A - project(a1)((select 'a1' < 'a2') ((rename 'a' as 'a1')(A) x (rename 'a' as 'a2')(A)))
C'est du moins ce que j'ai dû faire dans une situation similaire.
J'espère que cela aide quelqu'un
laisse penser que nous avons une relation avec un attribut A et les valeurs 1,2,3
A
1
2
3
alors maintenant..
projetez les valeurs A et renommez avec A1
A1
1
2
3
projeter à nouveau les valeurs A et renommer avec A2
A2
1
2
3
rejoindre ceci 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
entendre toujours les valeurs A2 seront inférieures à A1 parce que nous join
comme ça (a2<a1
)
projetez maintenant A2 la sortie est comme ci-dessous
A2
1
2
diff maintenant avec l'attribut d'origine
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
J'ai oublié la plupart de la syntaxe algèbre relationnelle maintenant. Une requête utilisant simplement 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
J'espère que vous pourrez traduire!
Je sais que c'est vieux, mais voici une formule manuscrite qui pourrait être utile!
Relation A: 1,2,3,4
1. First we want to PROJECT and RENAME relation A
2. We then to a THETA JOIN with the test a1<a2
3. We then PROJECT the result of the relation to give us a single set of values
a1: 1,2,3 (not max value since a1<a2)
4. We then apply the difference operator with the original relation so:
1,2,3,4 --- 1,2,3 returns 4
4 is the Max value.
Project x(A) - Project A.x
(Select A.x < d.x (A x Rename d(A)))