在 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
子句中使用 join
和 aggregation
来做到这一点:
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)
)
);
我有一个简单的任务是在 '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
子句中使用 join
和 aggregation
来做到这一点:
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)
)
);