2016-03-20 7 views
1

私は、 'customer'(親テーブル)と 'order'テーブル(子テーブル)間の結合を行う単純なタスクを持っています。インパラは、任意のSQLエンジンのようだった場合は、書くことができます:Impalaの別のテーブルでMAX行の行を結合しますか?

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 

私は「と」「場所」の間に交換してみましたサブクエリが助けになりませんでした。あなたはfrom句にjoinaggregationでこれを行うことができるはず

答えて

0

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(order_date)の代わりにmax(id)を使用してください。 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) 
         ) 
       ); 
関連する問題