SAS distinctes dans la proc sql vs proc tri nodupkey
J'ai dataset suivante:
data work.dataset;
input a b c;
datalines;
27 93 71
27 93 72
46 68 75
55 55 33
46 68 68
34 34 32
45 67 88
56 75 22
34 34 32
;
run;
Je veux sélectionner tous les enregistrements distincts à partir des 2 premières colonnes, de sorte que j'ai écrit:
proc sql;
create table work.output1 as
select distinct t1.a,
t1.b
from work.dataset t1;
quit;
Mais maintenant, je veux savoir quelle est la valeur de var c stands dans les précédents situé à côté de la combinaison (var, var b) vu dans la sortie. Est-il un moyen de le savoir? J'ai essayé de suivre proc genre, mais je ne sais pas si il fonctionne de la même façon que la sélection d'enregistrements distincts dans la proc sql.
proc sort data = work.dataset out = work.output2 NODUPKEY;
by a b;
run;
Merci pour l'aide à l'avance.
OriginalL'auteur user2280549 | 2014-01-21
Vous devez vous connecter pour publier un commentaire.
PROC SORT
avecNODUPKEY
renverra toujours le physique d'abord l'enregistrement - c'est à dire que vous la liste des données,c=71
sera conservé pour toujours.PROC SQL
ne sera pas nécessairement le retour de tout article particulier; vous pourriez demandermin
oumax
, mais vous ne pouvait pas garantir le premier enregistrement dans l'ordre de tri indépendamment de la façon dont vous avez fait la requête SQL sera souvent recours les données nécessaires pour accomplir la requête de manière aussi efficace que possible.Ils seront identiques, de sorte qu'ils reviennent tous les deux le même nombre d'enregistrements, si c'est votre préoccupation.
Vous ne pouvez pas accomplir exactement la même chose de façon simple en SQL; parce que SQL ne pas avoir un concept de ligne de commande, vous devez soit avoir une méthode de sélection des c (
max(c)
,min(c)
, etc.) ou vous devez ajouter une ligne de contre et de choisir la valeur la plus basse.Par exemple:
C'est en utilisant un cheat (sachant que rowcounter*100 dominent toujours la taille de c); bien sûr, si votre c n'ont pas de valeurs appropriées pour que, cela ne fonctionnera pas et vous êtes mieux de la fusion sur la facture.
Si vous êtes intéressé dans le SQL solution, vous pouvez envisager d'afficher explicitement comme une question distincte comme le SQL-seulement folk répondra ensuite.
OriginalL'auteur Joe
NODUPKEY le retour de l'observation pour chaque clé. Dans votre exemple, un seul des deux observations avec a=27 et b=93 seront conservés. Soit c=71 ou c=72 sera perdu.
La NODUPREC option supprimer les enregistrements en double. Les deux observations avec a=27 et b=93 seront conservés, mais l'un des deux seulement avec les valeurs a=34, b=34 et c=32.
Dans le sql de la requête select distinct, aucun enregistrement n'est vraiment tombé comme variable c pas partie de la sélection. Dans le proc tri nodupkey exemple SAS ne garde que la première observation qu'il rencontre.
Merci pour les réponses. Un de plus, est-il une possibilité de faire proc sql prenant n colonnes et "distincting" il basé sur seulement une partie d'entre eux? EN d'autres termes, je voudrais ajouter la fonction row_number à mes données, sélectionnez a, b et row_number mais la particularité sera mis sur les deux premières colonnes.
OriginalL'auteur Laurent de Walick
Sql ne retourne pas de valeur pour la variable c dans la requête ci-dessus, il n'est pas répertorié dans l'instruction select. Je pense que ce que vous cherchez peut-être est:
Si vous souhaitez que la valeur maximale de
c
ensuite, vous pouvez remplacer la fonction avecmax(t1.c) as c
, ou utiliser l'une des autres fonctions sql pour sélectionner votre valeur. Si vous souhaitez répliquer PROC TRI nodupkey, et prendre la première valeur de la liste, vous devez utiliser la fonction monotone (je sais... pas pris en charge par la SAS, mais il est là donc que ce soit). Votre code maintenant:OriginalL'auteur EconomySizeAl