it-swarm.com.de

Wählen Sie einen Spaltenwert, bei dem die andere Spalte maximal der Gruppe entspricht

Ich versuche zwei Spalten in einer Tabelle auszuwählen (ID und Zustand). Die Tabelle sollte den Status mit dem Maximalwert für jede ID anzeigen. Ich habe ein paar andere Beispiele ausprobiert, aber nichts scheint zu funktionieren.

Ursprüngliche Datenstruktur:

ID  state    value (FLOAT)
1   TX   921,294,481 
1   SC   21,417,296 
1   FL   1,378,132,290 
1   AL   132,556,895 
1   NC   288,176 
1   GA   1,270,986,631 
2   FL   551,374,452 
2   LA   236,645,530 
2   MS   2,524,536,050 
2   AL   4,128,682,333 
2   FL   1,503,991,028

Die resultierende Datenstruktur sollte daher so aussehen:

ID  STATE (Max Value)
1   FL
2   AL

Florida und Alabama haben die größten Werte in ihren ID-Gruppen.

Jede Hilfe wäre sehr dankbar. Ich habe bereits eine SO answer here gefunden, konnte aber die Antworten nicht für mich verwenden.

30
Richard Todd

Für SQL Server (und andere Produkte mit Fensterfunktionen):

SELECT *
FROM
(
   SELECT
     *,
     ROW_NUMBER() OVER (PARTITION BY ID ORDER BY value desc) as rn
   FROM
     UnnamedTable
) t
WHERE
   t.rn = 1
37

Sie können eine Unterabfrage verwenden, um dieses Ergebnis zu erhalten:

select t1.id, t1.[state] MaxValue
from yourtable t1
inner join
(
  select id, max(value) MaxVal
  from yourtable
  group by id
) t2
  on t1.id = t2.id
  and t1.value = t2.maxval
order by t1.id

Siehe SQL Fiddle mit Demo

7
Taryn

Eine Lösung, die auf der Annahme basiert, dass value numerisch ist:

SELECT
  [ID],
  [State],
  [Value]
FROM
(
  SELECT 
    [ID],
    [State],
    [Value],
    Rank() OVER (PARTITION BY [ID] ORDER BY [Value] DESC) AS [Rank]
  FROM [t1]
) AS [sub]
WHERE [sub].[Rank] = 1
ORDER BY
  [ID] ASC,
  [State] ASC

Wenn mehrere States mit demselben ID dasselbe Value haben, würden sie alle dasselbe Rank erhalten. Dies unterscheidet sich von der Verwendung von Row_Number, die eindeutige Zeilennummern zurückgeben, die Reihenfolge jedoch willkürlich gewählt wird. (Siehe auch: SQL RANK () versus ROW_NUMBER () )

7
Jacco