给定一个包含时间戳列的表,我希望得到10条最新记录,其中特定列是唯一的。
如何做到这一点?
数据:
purchases
-----------------------------------------------------------------
timestamp first_name last_name customer_id product_name purchase_amount
如何获得最近购买的5位客户以及product_name
和purchase_amount
?
结果:
James, Jackson, 1234, 'foo', 432.123
Tim, McTimothy, 321, 'bar', 5124.11
Bob, Bobbertson, 55, 'foo', 432.123
Claire, Rando, 191, 'tv', 700.00
Jimbo, Manman, 631, 'ps4', 450.00
此查询失败,因为它需要product_name
和purchase_amount
上的聚合,但我们不想要聚合,只需要最新值。
SELECT first_name, last_name, customer_id, product_id
FROM purchases
GROUP BY first_name, last_name, customer_id
ORDER BY timestamp DESC
LIMIT 10
答案 0 :(得分:0)
您可以尝试添加一个充当rank
的{{1}}列,如下所示:
id
答案 1 :(得分:0)
我假设customer_id是唯一的。所以我们只需要使用customer_id 小组条款
select * from purchases p2 where
concat(UNIX_TIMESTAMP((p2.timestamp)),'_',p2.customer_id)
in (
select concat(UNIX_TIMESTAMP(max(p.timestamp)),'_',p.customer_id)
from purchases p group by p.customer_id order by p.timestamp desc
) limit 10
答案 2 :(得分:0)
我认为这样做会:
SELECT p.*
FROM
(
SELECT customer_id, MAX(timestamp) last_purchase_time
FROM purchases
GROUP BY customer_id
ORDER BY MAX(timestamp) DESC
LIMIT 5
) lp
INNER JOIN purchases p ON p.customer_id = lp.customer_id and p.timestamp = lp.last_purchase_time
嵌套查询获取每个客户的上次购买时间,并进一步将嵌套结果集限制为5个最新客户。然后我们将其连接到购买表,以便我们可以看到每个客户上次购买的完整购买数据。这确实假设客户不能在完全相同的情况下进行两次购买,但这可能是安全的。