假设我们有两个表:客户和购买。 购买具有客户 ID、购买日期时间等。
在 Hive 或 impala SQL 中为所有客户选择最近购买的最佳方法是什么?
我看到了这个查询:
With recent as (
select customerID, max(purchaseDateTime) as dt
from purchases group by customerID
)
Select *
from customer c
join recent r
on c.customerID = r.customerID
join purchases p
on r.customerId = p.customerid and
p.purchaseDateTime = dt
似乎这并没有达到应有的效率...
我会使用row_number()
:
Select c.*, p.*
from customer c join
(select p.*,
row_number() over (partition by p.customerid order by p.purchaseDateTime desc) as seqnum
from purchases p
) p
on c.customerId = p.customerid and p.purchaseDateTime = dt
where seqnum = 1;
row_number()
是 ANSI 标准功能,因此它是标准 SQL。 一般来说,它应该比执行显式group by
和join
更快。
一个区别是 - 在平局的情况下 - 这将返回一行。 查询将返回多行。 如果需要该行为,请将row_number()
更改为rank()
。