SQL - 获取按列排序的10条记录,其中一些列是唯一的

时间:2017-04-25 02:54:55

标签: mysql sql

给定一个包含时间戳列的表,我希望得到10条最新记录,其中特定列是唯一的。

如何做到这一点?

实施例

数据:

purchases
-----------------------------------------------------------------
timestamp   first_name    last_name   customer_id  product_name  purchase_amount

如何获得最近购买的5位客户以及product_namepurchase_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_namepurchase_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

3 个答案:

答案 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个最新客户。然后我们将其连接到购买表,以便我们可以看到每个客户上次购买的完整购买数据。这确实假设客户不能在完全相同的情况下进行两次购买,但这可能是安全的。