这是StackOverflow上经常出现的greatest-n-per-group
个问题的一个例子.
以下是我通常建议的解决方法:
SELECT c.*, p1.*
FROM customer c
JOIN purchase p1 ON (c.id = p1.customer_id)
LEFT OUTER JOIN purchase p2 ON (c.id = p2.customer_id AND
(p1.date < p2.date OR (p1.date = p2.date AND p1.id < p2.id)))
WHERE p2.id IS NULL;
说明:给定第p1
行,不应该有第p2
行有相同的客户和更晚的日期(如果是领带,则不应该有更晚的id
).当我们发现这是真的,那么p1
是该客户最近购买的.
关于索引,我会在purchase
个列(customer_id
、date
、id
)上创建一个复合索引.这可能允许使用覆盖索引进行外部连接.确保在您的平台上进行测试,因为优化依赖于实现.使用RDBMS的功能分析优化计划.例如,MySQL上的EXPLAIN
.
有些人使用子查询而不是我上面展示的解决方案,但我发现我的解决方案更容易解决关系.