2013-06-18 2 views
1

У меня есть две таблицы, которые я использую для извлечения данных и из этих данных. Я хочу идентифицировать записи, которые являются последними, связанными с определенным значением. Моя первая таблица:Postgres: получить последнюю запись из таблицы

g_190048(
    id, 
    logger_timestamp, 
    message_id, 
    begin_calc_timestamp , 
    intersection_id, 
    matched_nr , 
    distance , 
    remainingphase_time , 
    current_phase , 
    advice_state, 
    advice , 
    mode, 
    CONSTRAINT g_190048_pk 
    PRIMARY KEY (logger_timestamp , id) 
) 

"1001";1370253333921;190048;1546516;100;1;8028;36;1;0;-100;1 
"1001";1370253334093;190048;1546719;100;1;7885;36;1;0;-100;1 
"1001";1370253334593;190048;1547235;100;1;7885;36;1;0;-100;1 
"1001";1370253334875;190048;1547516;100;1;7733;36;1;0;-100;1 
"1001";1370253334906;190048;1547547;100;1;6631;35;1;0;-100;1 
"1001";1370253335406;190048;1548047;100;1;6631;35;1;0;-100;1 
"1001";1370253335687;190048;1548328;100;1;6306;35;1;0;-100;1 
"1001";1370253335906;190048;1548532;100;1;5791;34;1;0;-100;1 
"1001";1370253336234;190048;1548875;100;1;5518;34;1;0;-100;1 
"1001";1370253336578;190048;1549157;100;1;5349;34;1;0;-100;1 

Вторая таблица:

g_190049 (
    id, 
    logger_timestamp, 
    message_id, 
    begin_calc_timestamp, 
    msg1_recd_timestamp, 
    msg2_recd_timestamp, 
    msg1_end_timestamp, 
    msg2_end_timestamp 
) 

"1001";1370253333921;190049;1546516;1546516;1546516;1546578;1546578; 
"1001";1370253334093;190049;1546719;1546719;1546719;1546735;1546750; 
"1001";1370253334593;190049;1547235;1547235;1547235;1547250;1547250; 
"1001";1370253334890;190049;1547516;1547516;1547516;1547532;1547532; 
"1001";1370253334921;190049;1547547;1547547;1547547;1547563;1547563; 
"1001";1370253335421;190049;1548047;1548047;1548047;1548063;1548063; 
"1001";1370253335703;190049;1548328;1548328;1548328;1548344;1548344; 
"1001";1370253335906;190049;1548532;1548532;1548532;1548563;1548563; 
"1001";1370253336250;190049;1548875;1548875;1548875;1548891;1548891; 
"1001";1370253336578;190049;1549157;1549157;1549157;1549235;1549235; 

У меня есть запрос, который соединяет две таблицы и возвращает меня msg1_recd_timestamp и remainingphase_timestamp

Query1:

SELECT 
    g_190049.logger_timestamp, 
    g_190049.msg1_recd_timestamp, 
    g_190048.distance , 
    g_190048.remainingphase_time, 
    g_190048.current_phase 
FROM g_190049 g_190049, g_190048 g_190048 
WHERE 
    g_190049.id = g_190048.id 
    AND g_190049.begin_calc_timestamp = g_190048.begin_calc_timestamp 
    AND g_190048.intersection_id = 100 
    and g_190048.matched_nr = 1 
    and g_190049.logger_timestamp BETWEEN '1370246100000' AND '1370253364000') 

Этот вывод дает мне:

1370253333921 1546516 8028 36 1 
    1370253334093 1546719 7885 36 1 
    1370253334593 1547235 7885 36 1 
    1370253334890 1547516 7733 36 1 
    1370253334921 1547547 6631 35 1 
    1370253335421 1548047 6631 35 1 
    1370253335703 1548328 6306 35 1 
    1370253335906 1548532 5791 34 1 
    1370253336250 1548875 5518 34 1 
    1370253336578 1549157 5349 34 1 
    1370253336859 1549500 5167 34 1 

Но то, что я хочу, последняя строка remainingphase_timestamp

1370253334890 1547516 7733 36 1 
    1370253335703 1548328 6306 35 1 
    1370253336859 1549500 5167 34 1 

Если у меня есть выход Query1 в таблице, я могу достичь своей цели с помощью

SELECT * 
from TEMPO 
where logger_timestamp IN (
    select max(logger_timestamp) 
    from TEMPO 
    Group by remaining_time 
) 

Но Я не знаю, как интегрировать оба запроса.

+0

Загляните в 'order by' и' limit'. И «присоединяйтесь». –

+0

попробовать что-то вроде ... 'ВЫБРАТЬ g_190049.logger_timestamp, g_190049.msg1_recd_timestamp, g_190048.distance, g_190048.remainingphase_time, g_190048.current_phase ОТ g_190049 g_190049 правое внешнее соединение g_190048 g_190048 на g_190049.id = g_190048 .id ГДЕ g_190049.begin_calc_timestamp = g_190048.begin_calc_timestamp и g_190048.intersection_id = 100 и g_190048.matched_nr = 1 и g_190049.logger_timestamp между '1370246100000' и '1370253364000'); ' –

+0

Анантха, добавить его в качестве ответ. –

ответ

1
select distinct on (remainingphase_time) 
    g_190049.logger_timestamp, 
    g_190049.msg1_recd_timestamp, 
    g_190048.distance , 
    g_190048.remainingphase_time, 
    g_190048.current_phase 
from 
    g_190049 
    inner join 
    g_190048 using(id, begin_calc_timestamp) 
where 
    g_190048.intersection_id = 100 
    and g_190048.matched_nr = 1 
    and g_190049.logger_timestamp between '1370246100000' and '1370253364000' 
order by remainingphase_time, g_190049.logger_timestamp desc 
+0

Спасибо за ответ –

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