2009-07-31 15 views
1

Ich habe eine Tabelle mit drei Spalten: Kategorie, Zeitstempel und Wert.SQL-Abfrage für Top 5 jeder Kategorie

Was ich will, ist eine SQL-Auswahl, die mir die 5 jüngsten Werte jeder Kategorie geben wird. Wie würde ich das machen und tun?

Ich habe versucht, dieses:

select 
    a."Category", 
    b."Timestamp", 
    b."Value" 
from 
(select "Category" from "Table" group by "Category" order by "Category") a, 
(select a."Category", c."Timestamp", c."Value" from "Table" c 
where c."Category" = a."Category" limit 5) b 

Leider wird es erlauben es nicht, weil „Unterabfrage in FROM anderen Beziehungen der gleichen Abfrageebene nicht finden können“.

Ich benutze übrigens PostGreSQL 8.3.

Jede Hilfe wird geschätzt.

+0

Ähnliche Fragen hier: http://stackoverflow.com/questions/1146913/select-10-rows-per-day-with-order/1174434#1174434 – krdluzni

+0

Es gibt n Kategorien @hobodave –

+0

Ich bin nicht zu stark vereinfachend. Es kann eine beliebige Anzahl von Kategorien geben, von 3 bis 30000. –

Antwort

4
SELECT t1.category, t1.timestamp, t1.value, COUNT(*) as latest 
FROM foo t1 
JOIN foo t2 ON t1.id = t2.id AND t1.timestamp <= t2.timestamp 
GROUP BY t1.category, t1.timestamp 
HAVING latest <= 5; 

Hinweis: diese ausprobieren und sehen, ob es geeignet für Ihre Bedürfnisse erfüllt. Es wird nicht skalieren gut für große Gruppen.

+0

Vielen Dank. Leistung ist glücklicherweise hier nicht das Wesentliche, also das alles, was ich brauche. Vielen Dank! :-) –

+0

das finde ich jetzt – complez

Verwandte Themen