J'ai une table comme celle-ci:
ID | Val | Kind
----------------------
1 | 1337 | 2
2 | 1337 | 1
3 | 3 | 4
4 | 3 | 4
Je veux faire un SELECT
qui retournera seulement la première ligne pour chacun Val
, en passant par Kind
.
Exemple de sortie:
ID | Val | Kind
----------------------
2 | 1337 | 1
3 | 3 | 4
Comment puis-je construire cette requête?
oracle
greatest-n-per-group
BrunoLM
la source
la source
ORDER BY ID DESC
, mais ce n'est pas pertinent pour la question. Dans cet exemple, je m'en fiche.Réponses:
Cette solution utilise également
keep
, maisval
etkind
peut aussi être simplement calculé pour chaque groupe sans sous - requête:dbfiddle ici
KEEP… FIRST et KEEP… LAST sont une fonctionnalité d’agrégats spécifique à Oracle. Vous pouvez en savoir plus à ce sujet ici dans la documentation Oracle ou sur ORACLE_BASE :
la source
Utilisez une expression de table commune (CTE) et une fonction de fenêtrage / classement / partitionnement telle que ROW_NUMBER .
Cette requête créera une table en mémoire appelée ORDERED et ajoutera une colonne supplémentaire de rn qui est une séquence de nombres de 1 à N. La PARTITION BY indique qu'elle doit redémarrer à 1 chaque fois que la valeur de Val change et que nous voulons commander rangées par la plus petite valeur de Kind.
L'approche ci-dessus doit fonctionner avec tout SGBDR qui a implémenté la fonction ROW_NUMBER (). Oracle propose des fonctionnalités élégantes, telles qu’exprimées dans la réponse de mik, qui produiront généralement de meilleures performances que cette réponse.
la source
La solution de bilinkc fonctionne bien, mais je pensais aussi jeter la mienne. Il a le même coût, mais pourrait être plus rapide (ou plus lent, je ne l’ai pas testé). La différence est qu'il utilise First_Value au lieu de Row_Number. Puisque nous ne nous intéressons qu'à la première valeur, dans mon esprit, c'est plus simple.
Données de test.
Si vous préférez, voici l'équivalent CTE.
la source
id
sont uniques.Vous pouvez utiliser
keep
pour sélectionner un membreid
de chaque groupe:dbfiddle ici
la source
la source