在 Impala 的另一个 table 中加入具有 MAX 行的行?

Join row with MAX row in another table in Impala?

我有一个简单的任务是在 'customer' (parent table) 和 'order' table (child table) 其中 child table 的连接行具有最新(最大)订单日期值。如果 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

我尝试用 'where' 替换子查询之间的 'and' 但没有帮助。

您应该可以在 from 子句中使用 joinaggregation 来做到这一点:

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)。如果 ID 是按顺序分配的,那么这将执行您想要的操作。

您可以使用 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)
                        )
                 );