|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité régulier
![]() Inscription : août 2008 Messages : 32 ![]() |
Bonjour,
Je cherche à écrire une requête SQL en SAS pour pouvoir écrire dans ma table TEST2 uniquement un enregistrement par NOM avec le NUMERO le plus élevé et le MONTANT le plus gros. Dans mon exemple ci-dessous, le résultat de ma requêtre SQL me donne 2 enregistrements, par contre je désire avoir seulement le résultat suivant : Éric 6 200 À noté que cela est un exemple, s.v.p. ne pas répondre à ma question avec : where = (NOM = 'Éric' and NUMERO = '6' and MT = 200) car pour vrai, j'extrait 1 million de données. En résumé, j'essaye d'effectuer un genre de last.output = avoir le dernier enregistrement d'une requêtre selon un tri. Selon plusieurs personnes, ca semble être impossible à réaliser, par contre, ça semble être du SQL de base. Pouvez-vous m'aider s.v.p. ? Merci et bonne journée. Code :
Résultat avec cette requêtre : Obs NOM NUMERO MT 1 Éric 6 100 2 Éric 6 200 |
||
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() ![]() Brice BeareParis Inscription : janvier 2011 Messages : 956 ![]() |
Je crois qu'il faut générer une table par personne puis concatener toutes les tables.
Code :
|
||
|
|
00
|
|
|
#3 |
|
Invité régulier
![]() Inscription : août 2008 Messages : 32 ![]() |
Merci pour la réponse, par contre je veux vraiment avoir seulement une requête SQL avec tes 2 proc sql
|
|
|
00
|
|
|
#4 | ||||
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Bonjour Eric.
En SQL, il n'y a pas forcément de solution basique. Mais j'ai quand même 2 solutions à te proposer. La 1e ne fonctionnera qu'en SQL SAS (donc pas de pass-thru, et si tes millions de lignes sont sur une base de données externe, attends-toi à un temps de traitement... un peu long) car on fusionne des stats et des données de détail dans la même requête. L'idée étant de procéder en deux temps : pour chaque nom et numéro, récupérer la ligne correspondant à un maximum de montant ; puis se servir de ce résultat en requête imbriquée (ou en passant par une table intermédiaire si tu manques de mémoire vive pour les requêtes imbriquées) pour récupérer la ligne avec le plus grand numéro. Code :
Code :
S'il n'y a pas de solution plus simple, c'est parce qu'une étape Data lit linéairement une table SAS (de la 1e à la dernière observation, en un seul passage), alors que les requêtes SQL font des passages successifs sur le fichier et donc on ne peut pas utiliser l'ordre des observations. Tu auras le même souci le jour où tu voudras faire l'équivalent d'un LAG ou d'un RETAIN en SQL : ce genre de notions n'est pas intégrée au langage à cause de son mode d'exécution. Bon courage et tiens-nous au courant. Olivier |
||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com