2016-05-19 13 views
-1

Ich brauche einen max (Betrag) Wert jedes Konto aus der unten stehenden Tabelle erhaltenWie die Max-Wert-ID aus SQL-Tabelle erhalten

ID Account Amount 
1  rx00  100 
2  rx00  200 
3  rx00  100 
4  vxtt  50 
5  vxtt  70 
6  vxtt  80 

ich eine Ergebnistabelle als

brauchen
ID Account Amount 
2  rx00  200 
6  vxtt  80 

Bitte teilen Sie dem obigen Ergebnis

+0

_ "Ich brauche einen max (Betrag) Wert zu erhalten" _ unterscheidet sich Ihre erwartete Ergebnis. –

Antwort

1

Sie können ROW_NUMBER für diesen Einsatz:

SELECT ID, Account, Amount 
FROM (
    SELECT ID, Account, Amount, 
     ROW_NUMBER() OVER (PARTITION BY Account 
          ORDER BY Amount DESC) AS rn 
    FROM mytable) AS t 
WHERE t.rn = 1 

Wenn Sie Verbindungen haben, d. H. Mehr als einen Datensatz, der denselben maximalen Wert von Amount teilt und Sie alle diese Datensätze zurückgeben möchten, verwenden Sie RANK anstelle von ROW_NUMBER. Partitionierten von Konto und Betrag (Wert sortierte in desc Reihenfolge der Menge)

0
;With cte 
as 
(
select id,account,amount 
,row_number() over (partition by account order by amount desc) as rn 
from 
table 
) 
select * from cte where rn=1 

In oben-Code, ein einzigartiges RowNumber wird für jeden Wert zugewiesen .since wir können nicht direkt ROW_NUMBER oder einen berechneten Wert in where-Klausel auswählen. Ich benutzte eine virtuelle Tabelle

+0

Obwohl dieser Code die Frage beantworten kann, zusätzliche Kontext in Bezug auf _why_ und/oder _how_ es Antworten bietet die Frage würde erheblich verbessern seine langfristige Wert. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erklärung hinzuzufügen. –

+0

Erklären RowNumber und Partition ist außerhalb des Umfangs der Post. Aber ich lege einige Punkte – TheGameiswar

+0

Nicht sehen, Spalte in Cte ..? –

0

Sie können row_number verwenden, um das gewünschte Ergebnis zu erhalten.

DECLARE @table TABLE 
    (ID int, Account varchar(10),Amount int) 

    INSERT INTO @table 
    (ID,Account,Amount) 
    VALUES 
    (1,'rx00',100), 
    (2,'rx00',200), 
    (3,'rx00',100), 
    (4,'vxtt',50), 
    (5,'vxtt',70), 
    (6,'vxtt',80) 

    SELECT ID, Account, Amount 
    FROM (
     SELECT ID, Account, Amount, 
      ROW_NUMBER() OVER (PARTITION BY Account 
           ORDER BY Amount DESC) AS rnk 
     FROM @table) AS t 
    WHERE t.rnk = 1 

Dies wird der Ausgang sein:

ID Account Amount 
2 rx00 200 
6 vxtt 80 

Wenn Sie die ID-Spalte in der Ergebnismenge nicht benötigen, können Sie die folgende Abfrage verwenden können.

SELECT Account,max(Amount) AS Amount FROM @table t 
    GROUP BY Account 

Dies wird der Ausgang sein:

Account Amount 
rx00 200 
vxtt 80 
Verwandte Themen