2009-07-31 3 views
1

У меня есть таблица, которая имеет три столбца: Категория, Временная метка и Значение.SQL-запрос для Топ-5 каждой категории

Что я хочу - это выбор SQL, который даст мне 5 последних значений каждой категории. Как мне это сделать?

Я попытался это:

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 

К сожалению, он не допустит, потому что «подзапрос в FROM не может ссылаться на другие отношения того же уровня запросов».

Я использую PostGreSQL 8.3, кстати.

Любая помощь будет оценена по достоинству.

+0

Аналогичный вопрос здесь: http://stackoverflow.com/questions/1146913/select-10-rows-per-day-with-order/1174434#1174434 – krdluzni

+0

Есть n категорий @hobodave – 2009-07-31 23:32:50

+0

Я не упрощаю. Может быть любое количество категорий, от 3 до 30000. – 2009-07-31 23:40:13

ответ

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; 

Примечание: Попробуйте это и посмотреть, если он выполняет надлежащим образом для ваших нужд. Это не будет масштабироваться хорошо для больших групп.

+0

Большое вам спасибо. Производительность, к счастью, не является сущностью здесь, так что все, что мне нужно. Спасибо! :-) – 2009-07-31 23:48:10

+0

вот что я нахожу сейчас – complez

Смежные вопросы