2016-03-20 17 views
1

"Müşteri" (üst tablo) ve "sipariş" tablosu (alt tablo) arasında bir alt tablonun birleştirilen satırının en son (maksimum) sipariş tarihi değerine sahip olduğu birleştirme yapmak için basit bir görevim var. Impala herhangi bir SQL motoru gibi olsaydı yazabilirsiniz:Impala'da başka bir tabloda MAX satırı ile satır katılın

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 
); 

Açıkçası impala farklıdır ben sadece aşağıdaki hatayı alıyorum çünkü:

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

Ben 've' 'nerede' arasına ile değiştirmeye çalıştı alt sorgu ama yardımcı olmadı.

cevap

0

Sen from fıkrada bir join ve aggregation ile bunu mümkün olmalıdır:

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; 

Bu maksimum sipariş tarihi yalnızca bir düzen olduğunu varsayar. Bu makul değilse, belki de max(order_date) yerine max(id)'u kullanabilirsiniz. Ids sıralı olarak atanırsa, o zaman bu sizin istediğiniz şeyi yapacağız.

Sen exists kullanarak istediğini yapmak mümkün olabilir:

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) 
         ) 
       ); 
İlgili konular