2008-12-18 16 views
11

Obwohl diese Frage einfach aussieht, ist es etwas schwierig.Wie finde ich den Datensatz in einer Tabelle, die den Maximalwert enthält?

Ich habe eine Tabelle mit den folgenden Spalten:

table A: 
    int ID 
    float value 
    datetime date 
    varchar(50) group 

Ich mag die „ID“ und „Wert“ des Datensätze erhalten, die das maximale „date“ enthält, das von der Spalte „Gruppe“ zusammengefasst . Etwas wie "Was ist der neueste Wert für jede Gruppe?"

Ich kann jede Gruppe und ihre maximale Datum erhalten:

SELECT group, MAX(date) FROM A GROUP BY group; -- I also need the "ID" and "value"

Aber ich möchte mit dem höchsten Zeitpunkt die „ID“ und den Wert des Datensatzes haben.

Ein JOIN zwischen A und dem Ergebnis könnte die Antwort sein, aber es gibt keine Möglichkeit zu wissen, auf welchen Datensatz MAX (Datum) sich bezieht (falls das "Datum" wiederholt wird).

Kann jemand helfen?

Antwort

8

Sie könnten versuchen, mit einer Unterabfrage

 
select group, id, value, date from A where date in 
(select MAX(date) as date 
    from A 
    group by group) 
order by group 
0

Solange die Spalte Datum für jede Gruppe einzigartig ist glaube ich so etwas wie dies funktionieren könnte:

SELECT A.ID, A.Value 
FROM A 
    INNER JOIN (SELECT Group, MAX(Date) As MaxDate FROM A GROUP BY Group) B 
    ON A.Group = B.Group AND A.Date = B.MaxDate 
+0

es nicht eindeutig ist – Jonas

+0

, dass es schwer Art macht einen einzigen letzten Datensatz für jede Gruppe zu finden:] –

4

Das ist genau das, was analytische Funktionen waren gemacht für:

select group, 
     id, 
     value 
from (
     select group, 
       id, 
       value, 
       date, 
       max(date) over (partition by group) max_date_by_group 
     from A 
     ) 
where date = max_date_by_group 
2

Wenn Datum eindeutig zuzuordnen sind, dann haben Sie bereits Ihre Antwort. Wenn das Datum nicht eindeutig ist, benötigen Sie einen anderen Unifikant. Ohne einen natürlichen Schlüssel ist Ihre ID so gut wie jede andere. Einfach einen MAX (oder MIN, je nachdem, was Sie bevorzugen) darauf:

SELECT * 
FROM A 
JOIN (
    --Dedupe any non unqiue dates by getting the max id for each group that has the max date 
    SELECT Group, MAX(Id) as Id 
    FROM A 
    JOIN (
     --Get max date for each group 
     SELECT group, MAX(date) as Date 
     FROM A 
     GROUP BY group 
    ) as MaxDate ON 
     A.Group = MaxDate.Group 
     AND A.Date = MaxDate.Date 
    GROUP BY Group 
) as MaxId ON 
    A.Group = MaxId.Group 
    AND A.Id= MaxId.Id