Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/12/2011, 17h01   #1
Membre chevronné
 
Inscription : janvier 2006
Messages : 916
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 916
Points : 733
Points : 733
Par défaut Trouver les x plus grands par catégorie

Bonjour

J'ai une table à 3 colonnes dont la structure est
categorie, id_unique, valeur

Comment faire au plus simple pour récupérer
- les x plus grandes valeurs par catégorie (on considère que valeur est quasi une clé unique)
- les id_unique correspondant à ces valeurs, toujours par catégorie ?

Je vois bien comment générer autant de requêtes que de catégories,
Code :
1
2
3
SELECT top x  id_unique, valeur FROM matable WHERE categorie = 'categorie1' ORDER BY valeur DESC 
UNION ALL 
SELECT top x  id_unique, valeur FROM matable WHERE categorie = 'categorie2' ORDER BY valeur DESC ...
mais y a-t-il une façon de faire le tout en une seule requête, avec une sorte de mix entre TOP (ou LIMIT en mysql) et GROUP BY ?
Dans ce cas précis, j'utilise Access, mais le problème est plus général que ça.

Merci
guidav est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 17h14   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 653
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 653
Points : 2 655
Points : 2 655
Bonjour,

D'un point de vue purement SQL, les fonctions de fenêtrage font ceci de manière très simple.

Code :
1
2
3
4
5
6
7
8
9
 
WITH tmp AS (
SELECT id_category, valeur, id_unique, 
row_number() over(partition BY id_category ORDER BY valeur DESC) AS rnk
FROM ma_table)
 
SELECT * 
FROM tmp
WHERE rnk = X

D'un point de vue Access.... je ne saurai répondre tellement on est limité dessus.

P.S.: il ya une section Access sur developpez
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/12/2011, 17h30   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 333
Points : 18 333
Envoyer un message via MSN à CinePhil
Tu peux t'inspirer de cette source MySQL.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/12/2011, 19h08   #4
Membre chevronné
 
Inscription : janvier 2006
Messages : 916
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 916
Points : 733
Points : 733
Merci beaucoup CinePhil. J'avais déjà utilisé la division relationnelle pour un besoin similaire il y a quelques années, mais
1- ça m'était sorti de l'esprit
2- je ne sais pas si j'aurais pensé à l'utiliser ici

Merci beaucoup aussi à punkoff, car si je transpose cette requête dans ma base oracle (j'ai aussi ça en stock) ou sqlserver, ça sera en effet très simple, sans parler du rappel sur rownumber.
guidav est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 21h26   #5
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 653
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 653
Points : 2 655
Points : 2 655
Bah prenez un vrai sgbd ... a defaut y a postgreSql qui fait ca tres bien !
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2011, 09h54   #6
Membre chevronné
 
Inscription : janvier 2006
Messages : 916
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 916
Points : 733
Points : 733
Citation:
Envoyé par punkoff Voir le message
Bah prenez un vrai sgbd ... a defaut y a postgreSql qui fait ca tres bien !
Parce que vous pensez que j'ai le choix ? Je suis déjà bien content d'avoir pu abandonner du 100% excel (et j'ai fait le forcing) ! Le "vrai" sgbd est oracle 11 ici, mais j'ai pas du tout la main dessus et pas d'outils, je ne m'en sers qu'en cas d'absolue nécessité, d'autant plus que je suis le seul à savoir m'en servir.
guidav est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h32.


 
 
 
 
Partenaires

Hébergement Web