2014-07-11 4 views
5

Dies ist meine Tabellenstruktur:SQL: Filter Zeilen mit max Wert

File | Version  | Function 
1  | 1   | 1 
1  | 2   | 1 
1  | 3   | 1 
1  | 2   | 2 

2  | 1   | 4 
3  | 2   | 5 

ich es brauche nur diese Zeilen zurückgeben

1  | 3   | 1 
2  | 1   | 4 
3  | 2   | 5 

Bedeutung ich nur die Funktionen möchten, dass die neueste Version haben für jede Datei.

ich unten das Ergebnis nicht wollen, das heißt einzigartige Funktion IDs, die nicht die aktuellste Version

1  | 3   | 1 
1  | 2   | 2 
... 

Ich habe sah How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?, aber das gibt die jüngsten einzigartige Funktion ids sind.

Die Abfrage muss sqlite3-kompatibel sein.

Antwort

3

Ein effizienter Weg, dies zu tun, ist oft not exists zu verwenden:

select t.* 
from table t 
where not exists (select 1 
        from table t2 
        where t2.file = t.file and t2.Version > t.version 
       ); 

Diese Abfrage eines Index Vorteil nehmen table(file, version) können.

Dies umformuliert die Abfrage wie folgt: "Holen Sie mir alle Zeilen aus der Tabelle, wo die entsprechende Datei keine größere Version hat."

+0

prefectly Arbeitete, danke. Könntest du dir vielleicht meine nächste Frage ansehen, seit du 1/4 davon gelöst hast? http://stackoverflow.com/questions/24719716/sql-complex-sum-from-multiple-tables –

1

Beachten Sie, dass dies mehrere Zeilen pro Datei zurückgibt, wenn die letzte Version für eine Datei für verschiedene Funktionen vorhanden ist. Wenn Ihr Beispiel oben eine zusätzliche Zeile (1,3,2) hätte, würde dies 2 Zeilen für die Datei 1 zurückgeben.

select 
    t1.file, 
    t1.version, 
    t1.function 
from 
    mytable t1 
join (
    select 
     t2.file, 
     max(t2.version) max_version   
    from mytable t2 
    group by t2.file 
) t3 join t1.file = t3.file and t1.version = t3.max_version 
2

In SQLite 3.7.11 oder später, wenn Sie MAX verwenden, werden die anderen Werte garantiert mit dem größten Wert aus der Reihe kommen:

SELECT File, 
     MAX(Version) AS Version, 
     Function 
FROM MyTable 
GROUP BY File