Groupe par Max

SELECT tblIssue.SYMB, tblIssue.[PRCE], tblIssue.[Shareholder] FROM tblIssue 

J'essaye de tirer le symb et le prix pour le nombre maximum d'actionnaire par symb. Par exemple, je n'aurais qu'une seule ligne pour l'ASN où le prix serait de 60,62 $.

 SYMB Price Actionnaire
 ASN 0,00 $ 0
 ASN 0,00 $ 51
 ASN 25,18 $ 0
 ASN 25,26 $ 0
 ASN 36,00 $ 0
 ASN 60,62 $ 231
 ASNL 0,00 $ 101
 ASR $ 0.00 4
 ASR $ 0.00 24
 ASR 37,17 $ 13

 SELECT i1.* FROM tblIssue i1 LEFT OUTER JOIN tblIssue i2 ON (i1.[SYMB] = i2.[SYMB] AND i1.[Shareholder] < i2.[Shareholder]) WHERE i2.[SYMB] IS NULL; 

C'est un truc que j'utilise avec ce genre de problèmes: montrez-moi la ligne correspondant à i1 quand il n'y a pas d'autre rangée i2 avec le même [SYMB] et un plus grand [Shareholder] . Autrement dit, si aucune ligne avec un [Shareholder] n'existe, alors i1 doit avoir la plus grande valeur.

Cette requête renvoie plusieurs lignes lorsqu'il existe une égalité pour la valeur [Shareholder] élevée par valeur distincte de [SYMB] , mais la même chose est vraie pour la plupart des autres réponses données par d'autres personnes sur ce sujet. Pour résoudre ce problème, vous devez append une autre condition à la jointure en utilisant une colonne unique de la table.

Une sous-requête corrélée semble la plus facile (si je comprends votre problème):

 select symb, price, shareholder from issue i where price = ( select max(price) from issue where symb = i.symb) 

qui produit:

 ASN 61 231 ASNL 0 101 ASR 37 13 
 WITH mx AS ( SELECT tblIssue.SYMB, MAX(tblIssue.[Shareholder]) FROM tblIssue ) SELECT tblIssue.SYMB, tblIssue.[PRCE], tblIssue.[Shareholder] FROM tblIssue INNER JOIN mx ON mx.SYMB = tblIssue.SYMB AND mx.[Shareholder] = tblIssue.[Shareholder] 

Cela devrait produire:

 SYMB Price Shareholder ASN $60.62 231 ASNL $0.00 101 ASR $0.00 24 

Si c'est ce que vous cherchez.

Dans Oracle:

 SELECT symb, price FROM ( SELECT symb, price, ROW_NUMBER() OVER (PARTITION BY symb ORDER BY price DESC) AS rn FROM tblIssue ) WHERE rn = 1 

Cela aiderait;

 Select * From tblIssue t2 Join ( Select MAX(t1.Shareholder) shrhldr, t1.symb symb From tblIssue t1 Group by t1.symb ) tt On tt.shrhldr = t2.Shareholder and tt.symb = t2.symb 

Ceci est similaire à la réponse de Quassnoi, mais corrigé pour get le rang avec Max Shareholder, ce que le PO a demandé. Si vous avez plusieurs lignes pour le même symbole avec le même nombre d'actionnaires maximum, cela vous en donnerait un au hasard. Si vous les voulez tous, remplacez ROW_NUMBER par RANK.

 SELECT symb, price, shareholder FROM ( SELECT symb, price, shareholder, ROW_NUMBER() OVER (PARTITION BY symb ORDER BY shareholder DESC) AS rn FROM tblIssue ) WHERE rn = 1