SQL如何从所有客户中检索最后订购的2个列出的产品?
Posted
技术标签:
【中文标题】SQL如何从所有客户中检索最后订购的2个列出的产品?【英文标题】:SQL how to retrieve last ordered 2 of the listed products from all customers? 【发布时间】:2021-03-22 02:07:36 【问题描述】:这是我当前的查询:
SELECT
c.name, c.email, c.phone, sol.description, so.orderDate
FROM
SalesOrderLine sol
JOIN
SalesOrder so ON sol.salesOrderID = so.id
JOIN
Customer c ON so.customerID = c.id
WHERE
(orderDate >= '2020-05-01' AND orderDate <= '2020-09-09')
AND (description LIKE '%Seed Mix%' OR description LIKE '%Sesame Seeds (Natural)%')
ORDER BY
c.name
目标
我的目标是检索产品是种子混合物还是芝麻种子。并且在两个日期之间。但只显示每个客户为这两种产品订购的最近日期。
输出:
问题
我怎样才能获得他们为查询中提到的第一个或第二个产品订购的最早日期?
期望的输出:
【问题讨论】:
为什么 customername2 有 3 条同一日期的记录? 【参考方案1】:你可以使用row_number()
:
SELECT *
FROM (
SELECT c.name, c.email, c.phone, sol.description, so.orderDate,
RANK() OVER(PARTITION BY c.id, sol.product_id ORDER BY so.orderDate DESC) rn
FROM SalesOrderLine sol
JOIN SalesOrder so ON sol.salesOrderID = so.id
JOIN Customer c ON so.customerID = c.id
WHERE
orderDate >= '20200501'
AND orderDate <= '20200909'
AND (description LIKE '%Seed Mix%' OR description LIKE '%Sesame Seeds (Natural)%')
) t
WHERE rn = 1
ORDER BY name
注意:您似乎在description
上有完全匹配。如果是这样,使用相等检查而不是模式匹配更有效。所以:
AND description IN ('Seed Mix', 'Sesame Seeds (Natural)')
【讨论】:
使用order by name
而不使用c.
@LV98:好的,我调整了查询。我假设您在 SaleOrderLine 中有一个名为 product_id
的列来标识产品。您可能需要对此进行审核。以上是关于SQL如何从所有客户中检索最后订购的2个列出的产品?的主要内容,如果未能解决你的问题,请参考以下文章
SQL:我如何按顺序列出所有前2个订单的客户ID:第一个订单是帽子,第二个订单是太阳镜? [关闭]
编写一个 PL/SQL Proc 并在 proc 中调用一个函数。输入是productid。打印出订购产品 ID 的客户姓名