J'ai des problèmes avec ma requête SQL. J'ai la table movie suivante:
GENRE MAX(M.BUDGET) TITLE ------------------------------ ------------- ------------------------------ Western 1200000 The Good, the Bad and the Ugly Horror 806947 Psycho Crime 7000000 The Godfather: Part III Action 185000000 The Dark Knight Drama 26000000 Philadelphia Drama 13000000 In the Name of the Father Action 150000000 Batman Begins Historical 23800000 The Last Emperor Science-fiction 5800000 Planet of the Apes Crime 7000000 The Godfather Action 230000000 The Dark Knight Rises GENRE MAX(M.BUDGET) TITLE ------------------------------ ------------- ------------------------------ Comedy 28000000 Zoolander Crime 9000000 Pulp Fiction Crime 13000000 The Godfather: Part II War 70000000 Saving Private Ryan Science-fiction 28000000 Blader Runner Drama 33000000 Gran Torino
j'ai essayé cette commande: sélectionnez m.genre, max (m.budget), m.title du film m group par m.genre, m.title; et j'ai obtenu ce résultat:
Name Null? Type ----------------------------------------- -------- ---------------------------- ID_MOVIE NOT NULL NUMBER(4) TITLE NOT NULL VARCHAR2(30) GENRE NOT NULL VARCHAR2(30) YEAR NOT NULL NUMBER(4) COUNTRY NOT NULL VARCHAR2(30) DURATION NOT NULL NUMBER(3) BUDGET NUMBER(10) INCOMES NUMBER(10) ID_MOVIE_PREV NUMBER(4) ID_DIRECTOR
Je voudrais avoir le titre du maximum de chaque sexe. Quelqu'un peut-il me dire où est mon erreur? Merci d'avance!
3 Réponses :
Vous pouvez utiliser la fonction d'analyse row_number () :
select genre, budget,title
from
(
select genre, budget, title,
row_number() over (partition by genre order by budget desc) as rn
from movie
)
where rn = 1
le regroupement est effectué par partition par et la valeur maximale du budget est trouvée en triant par budget décroissant.
/ p>
Démo p >
À quoi sert "q. *" Ou comment s'appelle-t-il cette fonction?
Je soupçonne que votre requête ne s'agrège pas réellement, car vous vous attendez à ce que les tuples (genre, titre) soient uniques dans la table.
Vous pouvez utiliser une sous-requête corrélée pour filtrer la table :
GENRE | TITLE | BUDGET :-------------- | :----------------------------- | --------: Western | The Good, the Bad and the Ugly | 1200000 Horror | Psycho | 806947 Historical | The Last Emperor | 23800000 Action | The Dark Knight Rises | 230000000 Comedy | Zoolander | 28000000 Crime | The Godfather: Part II | 13000000 War | Saving Private Ryan | 70000000 Science-fiction | Blader Runner | 28000000 Drama | Gran Torino | 33000000
Cela me semble être le moyen le plus simple d'exprimer ce que vous essayez d'accomplir. Pour les performances, pensez à un index sur (genre, budget) .
Voici un démo sur DB Fiddle (basé sur l'hypothèse ci-dessus que votre ensemble de résultats actuel peut être considéré comme vos données brutes):
select genre,title, budget
from movie m
where budget = (
select max(m1.budget)
from movie m1
where m1.genre = m.genre
)
Dans Oracle, vous pouvez utiliser l'agrégation:
select genre,
max(title) keep (dense_rank first order by budget desc) as title,
max(budget) as budget
from movie m
group by genre;
L'expression keep fait essentiellement une fonction get-the-first-value.
Voulez-vous dire le genre au lieu du genre?