Mysql SQL-获取10条记录,按列排序,其中某些列是唯一的
给定一个带有时间戳列的表,我想获得10条最新记录,其中特定列是唯一的 如何做到这一点 例子: 数据:Mysql SQL-获取10条记录,按列排序,其中某些列是唯一的,mysql,sql,Mysql,Sql,给定一个带有时间戳列的表,我想获得10条最新记录,其中特定列是唯一的 如何做到这一点 例子: 数据: purchases ----------------------------------------------------------------- timestamp first_name last_name customer_id product_name purchase_amount James, Jackson, 1234, 'foo', 432.123 Tim,
purchases
-----------------------------------------------------------------
timestamp first_name last_name customer_id 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
如何获取最近购买的5位客户以及产品名称
和购买金额
结果:
purchases
-----------------------------------------------------------------
timestamp first_name last_name customer_id 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\u name
和purchase\u 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
您可以尝试添加一个
rank
列作为id
,如下所示:
SELECT first_name, last_name, customer_id, product_name
FROM
(SELECT first_name, last_name, customer_id, product_name, @rank := @rank + 1 AS rank
FROM purchases p1, (SELECT @rank := 0) r
ORDER BY timestamp DESC) p2
GROUP BY first_name, last_name, customer_id
LIMIT 10;
我假设客户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
我认为这样可以做到:
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个最近的客户。然后,我们将其连接回purchases表,以便查看每个客户上次购买的完整购买数据。这确实假设一个客户不可能在完全相同的情况下进行两次购买,但这可能是安全的。在支持横向连接/应用的现代数据库中,这将更容易实现。只需在purchases表的查询中输入您的LIMIT 5,按customer_id分组并按最大时间戳订购即可获得您所需的客户,然后将其与apply/侧向联接一起使用,以获得每个客户的最新购买。不幸的是,MySql已经脱离了“现代数据库”的范畴:没有应用/横向连接,没有窗口功能,没有CTE(除非你幸运地运行了8.01服务版本),没有完全连接。。。我可以继续,所有这些都可以在Oracle、Sql Server和Postgresql中使用。@Don P-是否可以在此表中添加一个自动递增主键列?@Fathahrhmanp不幸的是,没有主键