2014-09-16 2 views
0

я одну таблицы именованных tgps, которая имеет шесть полей и данныеНайти максимальный показатель для каждой группы, с дополнительными полями

 
Model ftype serial Date  latitude  longitude 
Car  B  2142 15/09/2014 S11.59.41.194 W077.07.33.184 
Car  A  2123 15/09/2014 S12.15.12.245 W076.55.08.194 
Truck A  2123 16/09/2014 S13.42.48.122 W071.53.22.081 
PickUp C  2111 14/09/2014 S14.36.05.071 W075.11.47.133 
PickUp A  2111 15/09/2014 S14.39.51.245 W075.10.00.000 
PickUp A  2111 14/09/2014 S14.41.14.040 W075.07.12.245 
Truck B  2123 13/09/2014 S14.42.51.092 W075.05.35.133 
Car  B  2142 14/09/2014 S14.46.14.040 W070.20.03.030 
Truck A  2123 13/09/2014 S15.54.53.163 W071.11.21.153 
Truck B  2123 16/09/2014 S15.58.40.051 W071.12.48.122 
Car  A  2123 16/09/2014 S16.18.06.061 W069.16.24.122 
Car  C  2142 13/09/2014 S16.29.27.092 W071.51.48.122 

Я хочу, чтобы выбрать запись, которая имеет наибольшее значение Date для каждого Model, ftype и serial, а также необходимо отобразить latitude и longitude, поэтому мой результат должен быть таким:

 
Model ftype serial Date  latitude  longitude 
Car  A  2123 16/09/2014 S16.18.06.061 W069.16.24.122 
Car  B  2142 15/09/2014 S11.59.41.194 W077.07.33.184 
PickUp A  2111 15/09/2014 S14.39.51.245 W075.10.00.000 
PickUp C  2111 14/09/2014 S14.36.05.071 W075.11.47.133 
Truck A  2123 16/09/2014 S13.42.48.122 W071.53.22.081 
Truck B  2123 16/09/2014 S15.58.40.051 W071.12.48.122 

Это необходимо внутреннее соединение с конкатенации полей (Model, ftype и serial), я пытался что-то как:

SELECT model + ftype + serial, date, latitude, longitude 
FROM (
    SELECT model + ftype + serial, max(date) 
    FROM tgps group by model, ftype, serial) 
as xw inner join tgps on tgps.model + tgps.ftype + tgps.serial = xw.model + xw.ftype + xw.serial 
and tgps.date = xw.max(date) 

, но это не работает.

+0

использование попытка Concat || вместо + – Aramillo

+0

последняя часть вашего SQL не имеет для меня большого смысла. Вероятно, это должно быть 'tgps.date = Max (xw.date)' Я больше не смотрю на это, хотя, кто знает, будет ли это работать. Если вы отформатируете SQL для большей читаемости, он может получить больше ответов. – gnomed

+0

также, «не работает», вероятно, худшее возможное описание проблемы, которую кто-то может дать на stackoverflow. Предоставление журналов и сообщений об ошибках в будущем. – gnomed

ответ

0

Вы можете использовать CTE, чтобы получить максимальную дату для каждой модели, ftype и serial. Затем вы можете присоединиться к этому в своей таблице, чтобы получить lat и долго для этих значений. SQL Fiddle

with CTE as 
(select 
model, 
ftype, 
serial, 
max(date) as maxdate 
from 
tgps 
group by 
model, 
ftype, 
serial 
) 

select 
t1.* 

from 
tgps t1 
inner join cte t2 
    on t1.model = t2.model 
    and t1.ftype = t2.ftype 
    and t1.serial = t2.serial 
    and t1.date = t2.maxdate 

order by t1.model, 
t1.ftype 
0

вы можете выбрать все строки, где другая строка с большей датой и той же модели, FTYPE и серийный делает not exist

select * from tgps t1 
where not exists (
    select 1 from tgps t2 
    where t2.model = t1.model 
    and t2.ftype = t1.ftype 
    and t2.serial = t1.serial 
    and t2.date > t1.date 
) 

или если у вас есть доступ к аналитическим функциям, это будет быстрее

select * from (
    select *, 
    row_number() over (partition by model, ftype, serial order by date desc) rn 
from tgps) t1 where rn = 1 
1

Вы можете использовать простой подзапрос, связанный с основным SELECT, чтобы получить дату макс от каждого объекта:

select 
    Model, ftype, serial, Date, latitude, longitude 
from 
    tgps T 
where 
    Date = 
     (
      select 
       max(Date) 
      from 
       tgps 
      where 
       Model = T.Model 
       and ftype = T.ftype 
       and serial = T.serial 
     ) 
0

Спасибо всем, это то, как я решить мою проблему:

SELECT tgps.model + tgps.ftype + tgps.serial,tgps.lat, tgps.lng, tgps.Date FROM tgps INNER JOIN (
    SELECT model, ftype, serial, max(Date) junto 
    FROM tgps group by model, ftype, serial) 
as xw on tgps.Date = xw.junto and tgps.serial = xw.serial and tgps.ftype = xw.ftype and tgps.model = xw.model