在SQL中获取最新客户记录的更好方法?



假设我们有两个表:客户和购买。 购买具有客户 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 byjoin更快。

一个区别是 - 在平局的情况下 - 这将返回一行。 查询将返回多行。 如果需要该行为,请将row_number()更改为rank()

最新更新