2016-03-20 4 views
1

У меня есть простая задача сделать соединение между «customer» (родительская таблица) и таблицей «order» (дочерняя таблица), где объединенная строка дочерней таблицы имеет последнее (максимальное) значение даты заказа. Если Impala были как любой SQL двигатель можно было бы написать:Соедините строку с номером МАКС в другой таблице в Импале?

select * from customer c 
join `order` o on o.customer_id=c.id 
and o.id=(
    select o2.id 
    from `order` o2 
    where o2.customer_id=c.id 
    order by o2.order_date 
    desc limit 1 
); 

Очевидно импала отличается, потому что я просто получаю следующее сообщение об ошибке:

Error while compiling statement: FAILED: ParseException line 4:1 cannot recognize input near 'select' 'o2' '.' in expression specification 

Я попытался заменить «и» с «где» между подзапрос, но это не помогло.

ответ

0

Вы должны быть в состоянии сделать это с join и aggregation в предложении from:

select c.*, o.* 
from customer c join 
    `order` o 
    on o.customer_id = c.id join 
    (select customer_id, max(o2.order_date) as maxod 
     from `order` o2 
     group by customer_id 
    ) oo 
    on oo.customer_id = o.customer_id and oo.maxod = o.order_date; 

Это предполагает, что максимальная дата заказа имеет только один заказ. Если это не разумно, то, возможно, вы можете просто использовать max(id) вместо max(order_date). Если идентификаторы назначаются последовательно, то это будет делать то, что вы хотите.

Вы могли бы быть в состоянии сделать то, что вы хотите с помощью exists:

select c.*, o.* 
from customer c join 
    `order` o 
    on o.customer_id = c.id 
where not exists (select 1 
        from `order` o2 
        where o2.customer_id = o.customer_id and 
         (o2.order_date > o.order_date or 
         (o2.order_date = o.order_date and o2.id > o.id) 
         ) 
       );