考虑以下表结构:

  • invoice:ID,client_id
  • items:ID,invoice_id,名称,日期

我的目标是获取以下数据集:client_id, name, date,但名称和日期是与最后购买product相对应的列。

我尝试了以下查询,但没有产生正确的结果

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;
分析解答

您没有提及您正在使用的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- "one-off, inline view";使用ROW_NUMBER函数,您将"partition"通过client_id您的数据,每个客户的所有购买均已依次编号,按购买日期下降 - 因此,每个客户的最新购买始终将始终具有RowNum = 1 - 这正是我从该CTE中选择的。