2015-09-22 6 views
1

Предположим, что у меня есть база данных, которая содержит следующие столбцы:MySQL Query получить последние N строк в группе

VehicleID|timestamp|lat|lon| 

I может иметь несколько раз превышает тот же VehicleId, но с другой временной метки. Таким образом, VehicleId, Timestamp является основным ключом.

Теперь я хотел бы иметь в результате последние N измерений на каждый идентификатор транспортного средства или первые N измерений на транспортное средство.

Как я могу перечислить последние N кортежей в соответствии с порядковым столбцом (например, в нашем случае timestamp) на идентификатор транспортного средства?

Пример:

|VehicleId|Timestamp| 
     1|1 
     1|2 
     1|3 
     2|1 
     2|2 
     2|3 
     5|5 
     5|6 
     5|7 
+1

возможно дубликат [Получить Top N записей для каждой группы сгруппированных результатов] (HTTP: // stackoverflow.com/questions/12113699/get-top-n-records-for-each-group-of-grouped-results) –

ответ

4

В MySQL это легко делается с помощью переменных:

select t.* 
from (select t.*, 
      (@rn := if(@v = vehicle, @rn + 1, 
         if(@v := vehicle, 1, 1) 
         ) 
      ) as rn 
     from table t cross join 
      (select @v := -1, @rn := 0) params 
     order by VehicleId, timestamp desc 
    ) t 
where rn <= 3; 
+0

Таким образом, единственный способ SQL для этого не доступен? – nikosdi

+0

@nikosdi. , , Есть и другие способы, но это единственный оператор SQL и лучший подход в MySQL. –