mysql SQL:如何选择每个客户最后购买的产品?

31moq8wy  于 2023-08-02  发布在  Mysql
关注(0)|答案(1)|浏览(123)

考虑以下表格结构:

  • invoice:id,client_id
  • items:id,invoice_id,name,date

我的目标是获得以下数据集:client_id, name, date,但名称和日期是与最后购买的产品相对应的列。
我尝试了以下查询,但它没有生成正确的结果

SELECT 
    i.client_id, ii.name, MAX(ii.date) 
FROM
    invoice i
INNER JOIN
    invoice_item ii ON i.id = ii.invoice_id
GROUP BY
    i.client_id;

字符串

ou6hu8tu

ou6hu8tu1#

你没有提到你正在使用的RDBMS-如果它支持CTE(公共表表达式)和窗口函数(许多最常用的RDBMS都支持它),你可以使用这样的东西:

WITH Purchases AS
(
    SELECT 
        i.client_id, ii.name, ii.date,
        RowNum = ROW_NUMBER() OVER (PARTITION BY i.client_id ORDER BY ii.date DESC)
    FROM
        invoice i
    INNER JOIN
        invoice_item ii ON i.id = ii.invoice_id
)
SELECT
    p.client_id, p.name, p.date
FROM
    Purchases
WHERE
    p.RowNum = 1;

字符串
Purchases是一种CTE --类似于“一次性的内联视图”;使用ROW_NUMBER函数,您可以按client_id对数据进行“分区”,每个客户的所有购买都按顺序编号,按购买日期降序排列-因此每个客户最近的购买将始终为RowNum = 1-这正是我从CTE中选择的。

相关问题