Присоединить строку к строке MAX в другой таблице в Impala?

У меня есть простая задача выполнить соединение между «клиентом» (родительская таблица) и таблицей «заказ» (дочерняя таблица), где объединенная строка дочерней таблицы имеет последнее (максимальное) значение даты заказа. Если бы 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
);

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

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

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


person mmierins    schedule 20.03.2016    source источник


Ответы (1)


Вы должны сделать это с помощью 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)
                        )
                 );
person Gordon Linoff    schedule 20.03.2016