考虑以下表结构:
invoice
:ID,client_iditems
: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中选择的。