如何仅与具有最新日期的不同项目连接

时间:2017-10-18 01:21:45

标签: sql postgresql

 SELECT t.aerop_salida,
    t.aerop_llegada,
    t.duracion,
    p.precio,
        p.fecha_hora_actualizacion
   FROM tramo t,
    vuelo v,
    tramo_precio p
  WHERE ((t.aerop_salida = v.aerop_salida) AND (t.aerop_llegada = v.aerop_llegada) AND ((p.tramo_aerolinea)::text = (t.aerolinea)::text) AND (p.tramo_aerop_salida = t.aerop_salida) AND (p.tramo_aerop_llegada = t.aerop_llegada));

输出

EZE LAX 15:25:00    12399   2017-10-10 19:50:58
EZE LAX 15:25:00    11900   2017-10-17 19:51:29
EZE LAX 16:20:00    12390   2017-10-15 23:55:03
AEP IGR 02:45:00    3200    2017-10-16 10:55:27
IGR LIM 03:15:00    5600    2017-10-11 20:00:41

但是应该只输出价格为11900的EZE - LAX,因为这是当前的(2017年10月17日更新)

编辑:

我正在尝试这样的事情,但却给我语法错误:

 SELECT t.aerop_salida,
    t.aerop_llegada,
    t.duracion,
    p.precio,
        p.fecha_hora_actualizacion
   FROM tramo t,
    vuelo v,
    (select DISTINCT tp.tramo_aerolinea, tp.tramo_aerop_llegada, tp.tramo_aerop_salida FROM tramo_precio tp order by tp.fecha_hora_actualizacion desc) p
  WHERE ((t.aerop_salida = v.aerop_salida) AND (t.aerop_llegada = v.aerop_llegada) AND ((p.tramo_aerolinea)::text = (t.aerolinea)::text) AND (p.tramo_aerop_salida = t.aerop_salida) AND (p.tramo_aerop_llegada = t.aerop_llegada));

2 个答案:

答案 0 :(得分:1)

首先,从不FROM子句中使用逗号。 始终使用正确的,明确的JOIN语法。毕竟这是二十一世纪。

您可以使用DISTINCT ON

执行您想要的操作
SELECT DISTINCT ON (t.aerop_salida, t.aerop_llegada) t.aerop_salida, t.aerop_llegada, t.duracion,
       p.precio, p.fecha_hora_actualizacion
FROM tramo t JOIN
     vuelo v
     ON t.aerop_salida = v.aerop_salida AND
        t.aerop_llegada = v.aerop_llegada JOIN
        tramo_precio p
        ON (p.tramo_aerolinea)::text = (t.aerolinea)::text) AND 
           (p.tramo_aerop_salida = t.aerop_salida) AND 
           (p.tramo_aerop_llegada = t.aerop_llegada)
ORDER BY t.aerop_salida, t.aerop_llegada, p.fecha_hora_actualizacion DESC;

答案 1 :(得分:0)

如果col3包含日期列

select * from A 
inner join 
(select distinct t.col1, t. col2 
 from
    (select col1, col2, col3
     from table
     grouping by col1, col2
     having max(col3)
     ) t
)outer
on a.col1 = outer.col1